<div dir="ltr">Since this commit, git-svn is having fits. the .pip file ends up with weird line endings and *always* showing up as modified in my working client. This makes it impossible to update polly reasonably with git-svn. Could someone look into this?<br><div class="gmail_quote"><div dir="ltr">On Tue, Jul 21, 2015 at 5:59 AM Michael Kruse <<a href="mailto:llvm@meinersbur.de">llvm@meinersbur.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: meinersbur<br>
Date: Tue Jul 21 07:56:36 2015<br>
New Revision: 242780<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D242780-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=GtRARu1OhuNUnGwucVVVEaYA6ZRK2AzC75MJQzdQ6kM&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=242780&view=rev</a><br>
Log:<br>
Update ISL to isl-0.15-61-gcea776f<br>
<br>
The motivation is to fix a wrong use of the inline qualifier. This<br>
fixes the Polly build using Visual Studio 2015 RC.<br>
<br>
<br>
Added:<br>
    polly/trunk/lib/External/isl/isl_hash_private.h<br>
    polly/trunk/lib/External/isl/isl_union_eval.c<br>
    polly/trunk/lib/External/isl/isl_union_macro.h<br>
    polly/trunk/lib/External/isl/isl_union_neg.c<br>
    polly/trunk/lib/External/isl/test_inputs/codegen/redundant.c<br>
    polly/trunk/lib/External/isl/test_inputs/codegen/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__redundant.st&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=9q-EIppoiIwcL17sDx0zmNoTXtIcmGbTDVq4rz54vxw&e=" rel="noreferrer" target="_blank">redundant.st</a><br>
Modified:<br>
    polly/trunk/lib/External/isl/GIT_HEAD_ID<br>
    polly/trunk/lib/External/isl/Makefile.am<br>
    polly/trunk/lib/External/isl/Makefile.in<br>
    polly/trunk/lib/External/isl/doc/manual.pdf<br>
    polly/trunk/lib/External/isl/doc/user.pod<br>
    polly/trunk/lib/External/isl/isl_aff.c<br>
    polly/trunk/lib/External/isl/isl_arg.c<br>
    polly/trunk/lib/External/isl/isl_ast_codegen.c<br>
    polly/trunk/lib/External/isl/isl_fold.c<br>
    polly/trunk/lib/External/isl/isl_hash.c<br>
    polly/trunk/lib/External/isl/isl_int_sioimath.c<br>
    polly/trunk/lib/External/isl/isl_polynomial.c<br>
    polly/trunk/lib/External/isl/isl_space.c<br>
    polly/trunk/lib/External/isl/isl_space_private.h<br>
    polly/trunk/lib/External/isl/isl_test.c<br>
    polly/trunk/lib/External/isl/isl_union_templ.c<br>
    polly/trunk/lib/External/isl/ltmain.sh<br>
    polly/trunk/lib/External/isl/test_inputs/brisebarre.pip<br>
    polly/trunk/lib/External/isl/test_inputs/codegen/omega/lefur04-0.c<br>
<br>
Modified: polly/trunk/lib/External/isl/GIT_HEAD_ID<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_GIT-5FHEAD-5FID-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=0aKFYMRGgQ8EFH90StQ12Qhp0q_TLlqrlZCLDlLhlkA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/GIT_HEAD_ID?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/GIT_HEAD_ID (original)<br>
+++ polly/trunk/lib/External/isl/GIT_HEAD_ID Tue Jul 21 07:56:36 2015<br>
@@ -1 +1 @@<br>
-isl-0.15-35-ga1e44f0<br>
+isl-0.15-61-gcea776f<br>
<br>
Modified: polly/trunk/lib/External/isl/Makefile.am<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_Makefile.am-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=MDMMKNp6Ke9AF7NDYpFaee9jRiUaHRDxh7WbcCWU42E&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/Makefile.am?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/Makefile.am (original)<br>
+++ polly/trunk/lib/External/isl/Makefile.am Tue Jul 21 07:56:36 2015<br>
@@ -106,6 +106,7 @@ libisl_la_SOURCES = \<br>
        isl_flow.c \<br>
        isl_fold.c \<br>
        isl_hash.c \<br>
+       isl_hash_private.h \<br>
        isl_id_to_ast_expr.c \<br>
        isl_id_to_pw_aff.c \<br>
        isl_ilp.c \<br>
@@ -322,7 +323,10 @@ EXTRA_DIST = \<br>
        print_templ.c \<br>
        isl_power_templ.c \<br>
        isl_pw_templ.c \<br>
+       isl_union_macro.h \<br>
        isl_union_templ.c \<br>
+       isl_union_eval.c \<br>
+       isl_union_neg.c \<br>
        isl.py \<br>
        doc/CodingStyle \<br>
        doc/SubmittingPatches \<br>
<br>
Modified: polly/trunk/lib/External/isl/Makefile.in<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_Makefile.in-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=RdSlKK8VAqDviuVBU-QxIk7SQBRndwyUUyCr4_bqtGc&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/Makefile.in?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/Makefile.in (original)<br>
+++ polly/trunk/lib/External/isl/Makefile.in Tue Jul 21 07:56:36 2015<br>
@@ -179,9 +179,10 @@ am__libisl_la_SOURCES_DIST = mp_get_memo<br>
        isl_convex_hull.c isl_ctx.c isl_ctx_private.h isl_deprecated.c \<br>
        isl_dim_map.h isl_dim_map.c isl_equalities.c isl_equalities.h \<br>
        isl_factorization.c isl_factorization.h isl_farkas.c isl_ffs.c \<br>
-       isl_flow.c isl_fold.c isl_hash.c isl_id_to_ast_expr.c \<br>
-       isl_id_to_pw_aff.c isl_ilp.c isl_ilp_private.h isl_input.c \<br>
-       isl_int.h isl_local_space_private.h isl_local_space.c isl_lp.c \<br>
+       isl_flow.c isl_fold.c isl_hash.c isl_hash_private.h \<br>
+       isl_id_to_ast_expr.c isl_id_to_pw_aff.c isl_ilp.c \<br>
+       isl_ilp_private.h isl_input.c isl_int.h \<br>
+       isl_local_space_private.h isl_local_space.c isl_lp.c \<br>
        isl_lp_private.h isl_map.c isl_map_list.c isl_map_simplify.c \<br>
        isl_map_subtract.c isl_map_private.h isl_map_to_basic_set.c \<br>
        isl_mat.c isl_mat_private.h isl_morph.c isl_morph.h isl_id.c \<br>
@@ -849,6 +850,7 @@ libisl_la_SOURCES = \<br>
        isl_flow.c \<br>
        isl_fold.c \<br>
        isl_hash.c \<br>
+       isl_hash_private.h \<br>
        isl_id_to_ast_expr.c \<br>
        isl_id_to_pw_aff.c \<br>
        isl_ilp.c \<br>
@@ -1063,7 +1065,10 @@ EXTRA_DIST = \<br>
        print_templ.c \<br>
        isl_power_templ.c \<br>
        isl_pw_templ.c \<br>
+       isl_union_macro.h \<br>
        isl_union_templ.c \<br>
+       isl_union_eval.c \<br>
+       isl_union_neg.c \<br>
        isl.py \<br>
        doc/CodingStyle \<br>
        doc/SubmittingPatches \<br>
<br>
Modified: polly/trunk/lib/External/isl/doc/manual.pdf<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_doc_manual.pdf-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=pDY44f4M_wGzZ9FCV7jxZa9l7RsmgoZzFgjzvAbIZpc&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/doc/manual.pdf?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
Binary files polly/trunk/lib/External/isl/doc/manual.pdf (original) and polly/trunk/lib/External/isl/doc/manual.pdf Tue Jul 21 07:56:36 2015 differ<br>
<br>
Modified: polly/trunk/lib/External/isl/doc/user.pod<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_doc_user.pod-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=9Fg4kB5_vEs7t-cpWrsA5u-zguHLVlNBS0JdMP5nQKg&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/doc/user.pod?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/doc/user.pod (original)<br>
+++ polly/trunk/lib/External/isl/doc/user.pod Tue Jul 21 07:56:36 2015<br>
@@ -196,7 +196,7 @@ an C<isl_val> instead of an C<isl_qpolyn<br>
<br>
 =item * The function C<isl_band_member_is_zero_distance><br>
 has been removed.  Essentially the same functionality is available<br>
-through C<isl_band_member_is_coincident>, except that is requires<br>
+through C<isl_band_member_is_coincident>, except that it requires<br>
 setting up coincidence constraints.<br>
 The option C<schedule_outer_zero_distance> has accordingly been<br>
 replaced by the option C<schedule_outer_coincidence>.<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_aff.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Faff.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=wPf1oMTIm4qnQs3WwXim-FUhCJDbSVVarAaInTzW6_8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_aff.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_aff.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_aff.c Tue Jul 21 07:56:36 2015<br>
@@ -2578,9 +2578,8 @@ __isl_give isl_pw_aff *isl_pw_aff_from_a<br>
 #undef PARTS<br>
 #define PARTS pw_aff<br>
<br>
-#define NO_EVAL<br>
-<br>
 #include <isl_union_templ.c><br>
+#include <isl_union_neg.c><br>
<br>
 static __isl_give isl_set *align_params_pw_pw_set_and(<br>
        __isl_take isl_pw_aff *pwaff1, __isl_take isl_pw_aff *pwaff2,<br>
@@ -4074,9 +4073,8 @@ __isl_give isl_set *isl_multi_aff_lex_ge<br>
 #undef PARTS<br>
 #define PARTS pw_multi_aff<br>
<br>
-#define NO_EVAL<br>
-<br>
 #include <isl_union_templ.c><br>
+#include <isl_union_neg.c><br>
<br>
 /* Given a function "cmp" that returns the set of elements where<br>
  * "ma1" is "better" than "ma2", return the intersection of this<br>
@@ -5765,8 +5763,7 @@ static __isl_give isl_union_pw_multi_aff<br>
                goto error;<br>
<br>
        data.upma2 = upma2;<br>
-       data.res = isl_union_pw_multi_aff_alloc(isl_space_copy(upma1->space),<br>
-                                      upma1->table.n);<br>
+       data.res = isl_union_pw_multi_aff_alloc_same_size(upma1);<br>
        if (isl_hash_table_foreach(upma1->space->ctx, &upma1->table,<br>
                                   &bin_entry, &data) < 0)<br>
                goto error;<br>
@@ -6049,40 +6046,26 @@ error:<br>
        return NULL;<br>
 }<br>
<br>
-/* Internal data structure for isl_union_pw_multi_aff_scale_multi_val.<br>
- * mv contains the mv argument.<br>
- * res collects the results.<br>
- */<br>
-struct isl_union_pw_multi_aff_scale_multi_val_data {<br>
-       isl_multi_val *mv;<br>
-       isl_union_pw_multi_aff *res;<br>
-};<br>
-<br>
 /* This function is called for each entry of an isl_union_pw_multi_aff.<br>
  * If the space of the entry matches that of data->mv,<br>
- * then apply isl_pw_multi_aff_scale_multi_val and add the result<br>
- * to data->res.<br>
+ * then apply isl_pw_multi_aff_scale_multi_val and return the result.<br>
+ * Otherwise, return an empty isl_pw_multi_aff.<br>
  */<br>
-static isl_stat union_pw_multi_aff_scale_multi_val_entry(void **entry,<br>
-       void *user)<br>
+static __isl_give isl_pw_multi_aff *union_pw_multi_aff_scale_multi_val_entry(<br>
+       __isl_take isl_pw_multi_aff *pma, void *user)<br>
 {<br>
-       struct isl_union_pw_multi_aff_scale_multi_val_data *data = user;<br>
-       isl_pw_multi_aff *pma = *entry;<br>
+       isl_multi_val *mv = user;<br>
<br>
        if (!pma)<br>
-               return isl_stat_error;<br>
+               return NULL;<br>
        if (!isl_space_tuple_is_equal(pma->dim, isl_dim_out,<br>
-                                   data->mv->space, isl_dim_set))<br>
-               return isl_stat_ok;<br>
-<br>
-       pma = isl_pw_multi_aff_copy(pma);<br>
-       pma = isl_pw_multi_aff_scale_multi_val(pma,<br>
-                                               isl_multi_val_copy(data->mv));<br>
-       data->res = isl_union_pw_multi_aff_add_pw_multi_aff(data->res, pma);<br>
-       if (!data->res)<br>
-               return isl_stat_error;<br>
+                                   mv->space, isl_dim_set)) {<br>
+               isl_space *space = isl_pw_multi_aff_get_space(pma);<br>
+               isl_pw_multi_aff_free(pma);<br>
+               return isl_pw_multi_aff_empty(space);<br>
+       }<br>
<br>
-       return isl_stat_ok;<br>
+       return isl_pw_multi_aff_scale_multi_val(pma, isl_multi_val_copy(mv));<br>
 }<br>
<br>
 /* Scale the elements of "upma" by the corresponding elements of "mv",<br>
@@ -6091,8 +6074,6 @@ static isl_stat union_pw_multi_aff_scale<br>
 __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_scale_multi_val(<br>
        __isl_take isl_union_pw_multi_aff *upma, __isl_take isl_multi_val *mv)<br>
 {<br>
-       struct isl_union_pw_multi_aff_scale_multi_val_data data;<br>
-<br>
        upma = isl_union_pw_multi_aff_align_params(upma,<br>
                                                isl_multi_val_get_space(mv));<br>
        mv = isl_multi_val_align_params(mv,<br>
@@ -6100,16 +6081,11 @@ __isl_give isl_union_pw_multi_aff *isl_u<br>
        if (!upma || !mv)<br>
                goto error;<br>
<br>
-       <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__data.mv&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=af8mmSCCIt1pM9WyelqkbXGHVoZNb1G-FU0BDgq5WTA&e=" rel="noreferrer" target="_blank">data.mv</a> = mv;<br>
-       data.res = isl_union_pw_multi_aff_alloc(isl_space_copy(upma->space),<br>
-                                               upma->table.n);<br>
-       if (isl_hash_table_foreach(upma->space->ctx, &upma->table,<br>
-                      &union_pw_multi_aff_scale_multi_val_entry, &data) < 0)<br>
-               goto error;<br>
+       return isl_union_pw_multi_aff_transform(upma,<br>
+                      &union_pw_multi_aff_scale_multi_val_entry, mv);<br>
<br>
        isl_multi_val_free(mv);<br>
-       isl_union_pw_multi_aff_free(upma);<br>
-       return data.res;<br>
+       return upma;<br>
 error:<br>
        isl_multi_val_free(mv);<br>
        isl_union_pw_multi_aff_free(upma);<br>
@@ -7707,8 +7683,7 @@ __isl_give isl_union_pw_aff *isl_union_p<br>
<br>
        ctx = isl_union_pw_aff_get_ctx(upa);<br>
        data.upma = upma;<br>
-       space = isl_union_pw_aff_get_space(upa);<br>
-       data.res = isl_union_pw_aff_alloc(space, upa->table.n);<br>
+       data.res = isl_union_pw_aff_alloc_same_size(upa);<br>
        if (isl_hash_table_foreach(ctx, &upa->table, &upa_pb_upma, &data) < 0)<br>
                data.res = isl_union_pw_aff_free(data.res);<br>
<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_arg.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Farg.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=I5YHDWx_XVqcCDNE_5-_w8UNIbmCDZl0ymmvKkaMxl0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_arg.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_arg.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_arg.c Tue Jul 21 07:56:36 2015<br>
@@ -812,7 +812,8 @@ static int parse_choice_option(struct is<br>
<br>
        if (!has_argument && (!arg[1] || arg[1][0] == '-')) {<br>
                unsigned u = decl->u.choice.default_selected;<br>
-               *(unsigned *)(((char *)opt) + decl->offset) = u;<br>
+               if (decl->offset != (size_t) -1)<br>
+                       *(unsigned *)(((char *)opt) + decl->offset) = u;<br>
                if (decl->u.choice.set)<br>
                        decl->u.choice.set(opt, u);<br>
<br>
@@ -829,7 +830,8 @@ static int parse_choice_option(struct is<br>
                        continue;<br>
<br>
                u = decl->u.choice.choice[i].value;<br>
-               *(unsigned *)(((char *)opt) + decl->offset) = u;<br>
+               if (decl->offset != (size_t) -1)<br>
+                       *(unsigned *)(((char *)opt) + decl->offset) = u;<br>
                if (decl->u.choice.set)<br>
                        decl->u.choice.set(opt, u);<br>
<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_ast_codegen.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fast-5Fcodegen.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=PDQPBLW5AopUCdCMfGrJ0RiGwibz6-r3fyltiodK26k&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_ast_codegen.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_ast_codegen.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_ast_codegen.c Tue Jul 21 07:56:36 2015<br>
@@ -1449,6 +1449,7 @@ static __isl_give isl_ast_graft *create_<br>
<br>
        depth = isl_ast_build_get_depth(build);<br>
        sub_build = isl_ast_build_copy(build);<br>
+       bounds = isl_basic_set_remove_redundancies(bounds);<br>
        sub_build = isl_ast_build_set_loop_bounds(sub_build,<br>
                                                isl_basic_set_copy(bounds));<br>
        degenerate = isl_ast_build_has_value(sub_build);<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_fold.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Ffold.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=f3OUROwGUCvJMDnQVXarPQTOsSkgTtXLmDbRAE-ad98&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_fold.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_fold.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_fold.c Tue Jul 21 07:56:36 2015<br>
@@ -685,6 +685,7 @@ __isl_give isl_qpolynomial_fold *isl_qpo<br>
 #define NO_SUB<br>
<br>
 #include <isl_union_templ.c><br>
+#include <isl_union_eval.c><br>
<br>
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,<br>
        __isl_take isl_space *dim)<br>
@@ -927,7 +928,6 @@ __isl_give isl_union_pw_qpolynomial_fold<br>
        __isl_take isl_union_pw_qpolynomial_fold *u,<br>
        __isl_take isl_pw_qpolynomial_fold *part)<br>
 {<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry;<br>
<br>
        u = isl_union_pw_qpolynomial_fold_cow(u);<br>
@@ -939,10 +939,7 @@ __isl_give isl_union_pw_qpolynomial_fold<br>
            isl_space_match(part->dim, isl_dim_param, u->space, isl_dim_param),<br>
            goto error);<br>
<br>
-       hash = isl_space_get_hash(part->dim);<br>
-       entry = isl_hash_table_find(u->space->ctx, &u->table, hash,<br>
-                       &isl_union_pw_qpolynomial_fold_has_same_domain_space,<br>
-                       part->dim, 1);<br>
+       entry = isl_union_pw_qpolynomial_fold_find_part_entry(u, part->dim, 1);<br>
        if (!entry)<br>
                goto error;<br>
<br>
@@ -1399,15 +1396,12 @@ static isl_stat add_pwqp(__isl_take isl_<br>
        isl_ctx *ctx;<br>
        isl_pw_qpolynomial_fold *pwf;<br>
        isl_union_pw_qpolynomial_fold **upwf;<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry;<br>
<br>
        upwf = (isl_union_pw_qpolynomial_fold **)user;<br>
<br>
        ctx = pwqp->dim->ctx;<br>
-       hash = isl_space_get_hash(pwqp->dim);<br>
-       entry = isl_hash_table_find(ctx, &(*upwf)->table, hash,<br>
-                        &isl_union_pw_qpolynomial_fold_has_same_domain_space,<br>
+       entry = isl_union_pw_qpolynomial_fold_find_part_entry(*upwf,<br>
                         pwqp->dim, 1);<br>
        if (!entry)<br>
                goto error;<br>
@@ -1419,10 +1413,9 @@ static isl_stat add_pwqp(__isl_take isl_<br>
                entry->data = isl_pw_qpolynomial_fold_add(entry->data, pwf);<br>
                if (!entry->data)<br>
                        return isl_stat_error;<br>
-               if (isl_pw_qpolynomial_fold_is_zero(entry->data)) {<br>
-                       isl_pw_qpolynomial_fold_free(entry->data);<br>
-                       isl_hash_table_remove(ctx, &(*upwf)->table, entry);<br>
-               }<br>
+               if (isl_pw_qpolynomial_fold_is_zero(entry->data))<br>
+                       *upwf = isl_union_pw_qpolynomial_fold_remove_part_entry(<br>
+                                                               *upwf, entry);<br>
        }<br>
<br>
        return isl_stat_ok;<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_hash.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fhash.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=PWyT6rN9TWIpMcxEmvxuBV9NmTQABFOUEVeWmVVkvUY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_hash.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_hash.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_hash.c Tue Jul 21 07:56:36 2015<br>
@@ -8,7 +8,7 @@<br>
  */<br>
<br>
 #include <stdlib.h><br>
-#include <isl/hash.h><br>
+#include <isl_hash_private.h><br>
 #include <isl/ctx.h><br>
 #include "isl_config.h"<br>
<br>
@@ -148,6 +148,13 @@ void isl_hash_table_free(struct isl_ctx<br>
        free(table);<br>
 }<br>
<br>
+/* A dummy entry that can be used to make a distinction between<br>
+ * a missing entry and an error condition.<br>
+ * It is used by isl_union_*_find_part_entry.<br>
+ */<br>
+static struct isl_hash_table_entry none = { 0, NULL };<br>
+struct isl_hash_table_entry *isl_hash_table_entry_none = &none;<br>
+<br>
 struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx,<br>
                                struct isl_hash_table *table,<br>
                                uint32_t key_hash,<br>
<br>
Added: polly/trunk/lib/External/isl/isl_hash_private.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fhash-5Fprivate.h-3Frev-3D242780-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=FaWYrfa00pCNZLuzVvFyBy27aaAgtqfFiH5vMgwmamI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_hash_private.h?rev=242780&view=auto</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_hash_private.h (added)<br>
+++ polly/trunk/lib/External/isl/isl_hash_private.h Tue Jul 21 07:56:36 2015<br>
@@ -0,0 +1,8 @@<br>
+#ifndef ISL_HASH_PRIVATE<br>
+#define ISL_HASH_PRIVATE<br>
+<br>
+#include <isl/hash.h><br>
+<br>
+extern struct isl_hash_table_entry *isl_hash_table_entry_none;<br>
+<br>
+#endif<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_int_sioimath.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fint-5Fsioimath.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=lCqGRe72deuz0hd9P94nvgcRT-tnOyMeIek-LPHuXcg&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_int_sioimath.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_int_sioimath.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_int_sioimath.c Tue Jul 21 07:56:36 2015<br>
@@ -100,7 +100,7 @@ static uint32_t isl_sioimath_smallgcd(in<br>
  *<br>
  * Per GMP convention, gcd(0,0)==0 and otherwise always positive.<br>
  */<br>
-inline void isl_sioimath_gcd(isl_sioimath_ptr dst, isl_sioimath_src lhs,<br>
+void isl_sioimath_gcd(isl_sioimath_ptr dst, isl_sioimath_src lhs,<br>
        isl_sioimath_src rhs)<br>
 {<br>
        int32_t lhssmall, rhssmall;<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_polynomial.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fpolynomial.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=zHIDQZ3jRbEo4JBuTEfTKnn1M3TzAM-2gINLQ2fcasU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_polynomial.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_polynomial.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_polynomial.c Tue Jul 21 07:56:36 2015<br>
@@ -2818,6 +2818,8 @@ __isl_give isl_pw_qpolynomial *isl_pw_qp<br>
 #define PARTS pw_qpolynomial<br>
<br>
 #include <isl_union_templ.c><br>
+#include <isl_union_eval.c><br>
+#include <isl_union_neg.c><br>
<br>
 int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp)<br>
 {<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_space.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fspace.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=psaxByW5rrkVo7yQ2z7dNp7yHNfcgfDrNHgyNdMzLdY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_space.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_space.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_space.c Tue Jul 21 07:56:36 2015<br>
@@ -1897,30 +1897,64 @@ int isl_space_compatible(__isl_keep isl_<br>
               dim1->n_in + dim1->n_out == dim2->n_in + dim2->n_out;<br>
 }<br>
<br>
-static uint32_t isl_hash_dim(uint32_t hash, __isl_keep isl_space *dim)<br>
+/* Update "hash" by hashing in "space".<br>
+ * Changes in this function should be reflected in isl_hash_space_domain.<br>
+ */<br>
+static uint32_t isl_hash_space(uint32_t hash, __isl_keep isl_space *space)<br>
 {<br>
        int i;<br>
        isl_id *id;<br>
<br>
-       if (!dim)<br>
+       if (!space)<br>
                return hash;<br>
<br>
-       isl_hash_byte(hash, dim->nparam % 256);<br>
-       isl_hash_byte(hash, dim->n_in % 256);<br>
-       isl_hash_byte(hash, dim->n_out % 256);<br>
+       isl_hash_byte(hash, space->nparam % 256);<br>
+       isl_hash_byte(hash, space->n_in % 256);<br>
+       isl_hash_byte(hash, space->n_out % 256);<br>
<br>
-       for (i = 0; i < dim->nparam; ++i) {<br>
-               id = get_id(dim, isl_dim_param, i);<br>
+       for (i = 0; i < space->nparam; ++i) {<br>
+               id = get_id(space, isl_dim_param, i);<br>
                hash = isl_hash_id(hash, id);<br>
        }<br>
<br>
-       id = tuple_id(dim, isl_dim_in);<br>
+       id = tuple_id(space, isl_dim_in);<br>
        hash = isl_hash_id(hash, id);<br>
-       id = tuple_id(dim, isl_dim_out);<br>
+       id = tuple_id(space, isl_dim_out);<br>
        hash = isl_hash_id(hash, id);<br>
<br>
-       hash = isl_hash_dim(hash, dim->nested[0]);<br>
-       hash = isl_hash_dim(hash, dim->nested[1]);<br>
+       hash = isl_hash_space(hash, space->nested[0]);<br>
+       hash = isl_hash_space(hash, space->nested[1]);<br>
+<br>
+       return hash;<br>
+}<br>
+<br>
+/* Update "hash" by hashing in the domain of "space".<br>
+ * The result of this function is equal to the result of applying<br>
+ * isl_hash_space to the domain of "space".<br>
+ */<br>
+static uint32_t isl_hash_space_domain(uint32_t hash,<br>
+       __isl_keep isl_space *space)<br>
+{<br>
+       int i;<br>
+       isl_id *id;<br>
+<br>
+       if (!space)<br>
+               return hash;<br>
+<br>
+       isl_hash_byte(hash, space->nparam % 256);<br>
+       isl_hash_byte(hash, 0);<br>
+       isl_hash_byte(hash, space->n_in % 256);<br>
+<br>
+       for (i = 0; i < space->nparam; ++i) {<br>
+               id = get_id(space, isl_dim_param, i);<br>
+               hash = isl_hash_id(hash, id);<br>
+       }<br>
+<br>
+       hash = isl_hash_id(hash, &isl_id_none);<br>
+       id = tuple_id(space, isl_dim_in);<br>
+       hash = isl_hash_id(hash, id);<br>
+<br>
+       hash = isl_hash_space(hash, space->nested[0]);<br>
<br>
        return hash;<br>
 }<br>
@@ -1933,7 +1967,24 @@ uint32_t isl_space_get_hash(__isl_keep i<br>
                return 0;<br>
<br>
        hash = isl_hash_init();<br>
-       hash = isl_hash_dim(hash, dim);<br>
+       hash = isl_hash_space(hash, dim);<br>
+<br>
+       return hash;<br>
+}<br>
+<br>
+/* Return the hash value of the domain of "space".<br>
+ * That is, isl_space_get_domain_hash(space) is equal to<br>
+ * isl_space_get_hash(isl_space_domain(space)).<br>
+ */<br>
+uint32_t isl_space_get_domain_hash(__isl_keep isl_space *space)<br>
+{<br>
+       uint32_t hash;<br>
+<br>
+       if (!space)<br>
+               return 0;<br>
+<br>
+       hash = isl_hash_init();<br>
+       hash = isl_hash_space_domain(hash, space);<br>
<br>
        return hash;<br>
 }<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_space_private.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Fspace-5Fprivate.h-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=nFn4YHrJPAOp9n7vv8R1OUn_Gfqp8UBXdiNyXwuTWEA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_space_private.h?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_space_private.h (original)<br>
+++ polly/trunk/lib/External/isl/isl_space_private.h Tue Jul 21 07:56:36 2015<br>
@@ -28,6 +28,7 @@ __isl_give isl_space *isl_space_underlyi<br>
        unsigned n_div);<br>
<br>
 uint32_t isl_space_get_hash(__isl_keep isl_space *dim);<br>
+uint32_t isl_space_get_domain_hash(__isl_keep isl_space *space);<br>
<br>
 isl_bool isl_space_is_domain_internal(__isl_keep isl_space *space1,<br>
        __isl_keep isl_space *space2);<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_test.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Ftest.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=aF1iwom9rNP-DRRUJ8Urz6LyO22TUnvYpIidyWsFtYs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_test.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_test.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_test.c Tue Jul 21 07:56:36 2015<br>
@@ -21,6 +21,7 @@<br>
 #include <isl_ctx_private.h><br>
 #include <isl_map_private.h><br>
 #include <isl_aff_private.h><br>
+#include <isl_space_private.h><br>
 #include <isl/set.h><br>
 #include <isl/flow.h><br>
 #include <isl_constraint_private.h><br>
@@ -4384,6 +4385,35 @@ int test_union_pw(isl_ctx *ctx)<br>
        return 0;<br>
 }<br>
<br>
+/* Test that isl_union_pw_qpolynomial_eval picks up the function<br>
+ * defined over the correct domain space.<br>
+ */<br>
+static int test_eval(isl_ctx *ctx)<br>
+{<br>
+       const char *str;<br>
+       isl_point *pnt;<br>
+       isl_set *set;<br>
+       isl_union_pw_qpolynomial *upwqp;<br>
+       isl_val *v;<br>
+       int cmp;<br>
+<br>
+       str = "{ A[x] -> x^2; B[x] -> -x^2 }";<br>
+       upwqp = isl_union_pw_qpolynomial_read_from_str(ctx, str);<br>
+       str = "{ A[6] }";<br>
+       set = isl_set_read_from_str(ctx, str);<br>
+       pnt = isl_set_sample_point(set);<br>
+       v = isl_union_pw_qpolynomial_eval(upwqp, pnt);<br>
+       cmp = isl_val_cmp_si(v, 36);<br>
+       isl_val_free(v);<br>
+<br>
+       if (!v)<br>
+               return -1;<br>
+       if (cmp != 0)<br>
+               isl_die(ctx, isl_error_unknown, "unexpected value", return -1);<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
 int test_output(isl_ctx *ctx)<br>
 {<br>
        char *s;<br>
@@ -5885,10 +5915,37 @@ static int test_tile(isl_ctx *ctx)<br>
        return 0;<br>
 }<br>
<br>
+/* Check that the domain hash of a space is equal to the hash<br>
+ * of the domain of the space.<br>
+ */<br>
+static int test_domain_hash(isl_ctx *ctx)<br>
+{<br>
+       isl_map *map;<br>
+       isl_space *space;<br>
+       uint32_t hash1, hash2;<br>
+<br>
+       map = isl_map_read_from_str(ctx, "[n] -> { A[B[x] -> C[]] -> D[] }");<br>
+       space = isl_map_get_space(map);<br>
+       isl_map_free(map);<br>
+       hash1 = isl_space_get_domain_hash(space);<br>
+       space = isl_space_domain(space);<br>
+       hash2 = isl_space_get_hash(space);<br>
+       isl_space_free(space);<br>
+<br>
+       if (!space)<br>
+               return -1;<br>
+       if (hash1 != hash2)<br>
+               isl_die(ctx, isl_error_unknown,<br>
+                       "domain hash not equal to hash of domain", return -1);<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
 struct {<br>
        const char *name;<br>
        int (*fn)(isl_ctx *ctx);<br>
 } tests [] = {<br>
+       { "domain hash", &test_domain_hash },<br>
        { "dual", &test_dual },<br>
        { "dependence analysis", &test_flow },<br>
        { "val", &test_val },<br>
@@ -5925,6 +5982,7 @@ struct {<br>
        { "schedule tree grouping", &test_schedule_tree_group },<br>
        { "tile", &test_tile },<br>
        { "union_pw", &test_union_pw },<br>
+       { "eval", &test_eval },<br>
        { "parse", &test_parse },<br>
        { "single-valued", &test_sv },<br>
        { "affine hull", &test_affine_hull },<br>
<br>
Added: polly/trunk/lib/External/isl/isl_union_eval.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Funion-5Feval.c-3Frev-3D242780-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=TXt_UUIxJlv_F9zFadMQky1XZs3ZwuimovQZkaLvDro&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_union_eval.c?rev=242780&view=auto</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_union_eval.c (added)<br>
+++ polly/trunk/lib/External/isl/isl_union_eval.c Tue Jul 21 07:56:36 2015<br>
@@ -0,0 +1,58 @@<br>
+/*<br>
+ * Copyright 2010      INRIA Saclay<br>
+ *<br>
+ * Use of this software is governed by the MIT license<br>
+ *<br>
+ * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,<br>
+ * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,<br>
+ * 91893 Orsay, France<br>
+ */<br>
+<br>
+#include <isl_union_macro.h><br>
+<br>
+/* Is the domain space of "entry" equal to "space"?<br>
+ */<br>
+static int FN(UNION,has_domain_space)(const void *entry, const void *val)<br>
+{<br>
+       PART *part = (PART *)entry;<br>
+       isl_space *space = (isl_space *) val;<br>
+<br>
+       if (isl_space_is_params(space))<br>
+               return isl_space_is_set(part->dim);<br>
+<br>
+       return isl_space_tuple_is_equal(part->dim, isl_dim_in,<br>
+                                       space, isl_dim_set);<br>
+}<br>
+<br>
+__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u,<br>
+       __isl_take isl_point *pnt)<br>
+{<br>
+       uint32_t hash;<br>
+       struct isl_hash_table_entry *entry;<br>
+       isl_space *space;<br>
+       isl_val *v;<br>
+<br>
+       if (!u || !pnt)<br>
+               goto error;<br>
+<br>
+       space = isl_space_copy(pnt->dim);<br>
+       if (!space)<br>
+               goto error;<br>
+       hash = isl_space_get_hash(space);<br>
+       entry = isl_hash_table_find(u->space->ctx, &u->table,<br>
+                                   hash, &FN(UNION,has_domain_space),<br>
+                                   space, 0);<br>
+       isl_space_free(space);<br>
+       if (!entry) {<br>
+               v = isl_val_zero(isl_point_get_ctx(pnt));<br>
+               isl_point_free(pnt);<br>
+       } else {<br>
+               v = FN(PART,eval)(FN(PART,copy)(entry->data), pnt);<br>
+       }<br>
+       FN(UNION,free)(u);<br>
+       return v;<br>
+error:<br>
+       FN(UNION,free)(u);<br>
+       isl_point_free(pnt);<br>
+       return NULL;<br>
+}<br>
<br>
Added: polly/trunk/lib/External/isl/isl_union_macro.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Funion-5Fmacro.h-3Frev-3D242780-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=DWx8bQFjEDcbFTrDh0cwmqTgE0Nl6nPcWIdVvWf41c4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_union_macro.h?rev=242780&view=auto</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_union_macro.h (added)<br>
+++ polly/trunk/lib/External/isl/isl_union_macro.h Tue Jul 21 07:56:36 2015<br>
@@ -0,0 +1,4 @@<br>
+#define xFN(TYPE,NAME) TYPE ## _ ## NAME<br>
+#define FN(TYPE,NAME) xFN(TYPE,NAME)<br>
+#define xS(TYPE,NAME) struct TYPE ## _ ## NAME<br>
+#define S(TYPE,NAME) xS(TYPE,NAME)<br>
<br>
Added: polly/trunk/lib/External/isl/isl_union_neg.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Funion-5Fneg.c-3Frev-3D242780-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=MGto2AW-aIA9xPRq6HKRQQyMA4oT_Wcie-E6ju0OryE&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_union_neg.c?rev=242780&view=auto</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_union_neg.c (added)<br>
+++ polly/trunk/lib/External/isl/isl_union_neg.c Tue Jul 21 07:56:36 2015<br>
@@ -0,0 +1,39 @@<br>
+/*<br>
+ * Copyright 2010      INRIA Saclay<br>
+ *<br>
+ * Use of this software is governed by the MIT license<br>
+ *<br>
+ * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,<br>
+ * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,<br>
+ * 91893 Orsay, France<br>
+ */<br>
+<br>
+#include <isl_union_macro.h><br>
+<br>
+/* Replace *entry by its opposite.<br>
+ *<br>
+ * Return isl_stat_ok on success and isl_stat_error on error.<br>
+ */<br>
+static isl_stat FN(UNION,neg_entry)(void **entry, void *user)<br>
+{<br>
+       PW **pw = (PW **) entry;<br>
+<br>
+       *pw = FN(PW,neg)(*pw);<br>
+<br>
+       return *pw ? isl_stat_ok : isl_stat_error;<br>
+}<br>
+<br>
+/* Return the opposite of "u".<br>
+ */<br>
+__isl_give UNION *FN(UNION,neg)(__isl_take UNION *u)<br>
+{<br>
+       u = FN(UNION,cow)(u);<br>
+       if (!u)<br>
+               return NULL;<br>
+<br>
+       if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
+                                  &FN(UNION,neg_entry), NULL) < 0)<br>
+               return FN(UNION,free)(u);<br>
+<br>
+       return u;<br>
+}<br>
<br>
Modified: polly/trunk/lib/External/isl/isl_union_templ.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_polly_trunk_lib_External_isl_isl-5Funion-5Ftempl.c-3Frev-3D242780-26r1-3D242779-26r2-3D242780-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=6HjTIEE9UU3bHl2RllMjTzPh5IvK5kdWzZBghq0izi4&s=YpNWBIccKYVIVs9u2NeOzanQpMaBGPLjFuS6MqQegw0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/isl_union_templ.c?rev=242780&r1=242779&r2=242780&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/lib/External/isl/isl_union_templ.c (original)<br>
+++ polly/trunk/lib/External/isl/isl_union_templ.c Tue Jul 21 07:56:36 2015<br>
@@ -10,11 +10,13 @@<br>
  * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France<br>
  */<br>
<br>
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME<br>
-#define FN(TYPE,NAME) xFN(TYPE,NAME)<br>
-#define xS(TYPE,NAME) struct TYPE ## _ ## NAME<br>
-#define S(TYPE,NAME) xS(TYPE,NAME)<br>
+#include <isl_hash_private.h><br>
+#include <isl_union_macro.h><br>
<br>
+/* A union of expressions defined over different domain spaces.<br>
+ * "space" describes the parameters.<br>
+ * The entries of "table" are keyed on the domain space of the entry.<br>
+ */<br>
 struct UNION {<br>
        int ref;<br>
 #ifdef HAS_TYPE<br>
@@ -151,47 +153,78 @@ isl_stat FN(FN(UNION,foreach),PARTS)(__i<br>
                                      &FN(UNION,call_on_copy), &data);<br>
 }<br>
<br>
-/* Is the space of "entry" equal to "space"?<br>
+/* Is the domain space of "entry" equal to the domain of "space"?<br>
  */<br>
-static int FN(UNION,has_space)(const void *entry, const void *val)<br>
+static int FN(UNION,has_same_domain_space)(const void *entry, const void *val)<br>
 {<br>
        PART *part = (PART *)entry;<br>
        isl_space *space = (isl_space *) val;<br>
<br>
-       return isl_space_is_equal(part->dim, space);<br>
-}<br>
+       if (isl_space_is_set(space))<br>
+               return isl_space_is_set(part->dim);<br>
<br>
-/* This function is not currently used by isl_aff.c.<br>
- */<br>
-static int FN(UNION,has_domain_space)(const void *entry, const void *val)<br>
-       __attribute__ ((unused));<br>
+       return isl_space_tuple_is_equal(part->dim, isl_dim_in,<br>
+                                       space, isl_dim_in);<br>
+}<br>
<br>
-/* Is the domain space of "entry" equal to "space"?<br>
+/* Return the entry, if any, in "u" that lives in "space".<br>
+ * If "reserve" is set, then an entry is created if it does not exist yet.<br>
+ * Return NULL on error and isl_hash_table_entry_none if no entry was found.<br>
+ * Note that when "reserve" is set, the function will never return<br>
+ * isl_hash_table_entry_none.<br>
+ *<br>
+ * First look for the entry (if any) with the same domain space.<br>
+ * If it exists, then check if the range space also matches.<br>
  */<br>
-static int FN(UNION,has_domain_space)(const void *entry, const void *val)<br>
+static struct isl_hash_table_entry *FN(UNION,find_part_entry)(<br>
+       __isl_keep UNION *u, __isl_keep isl_space *space, int reserve)<br>
 {<br>
-       PART *part = (PART *)entry;<br>
-       isl_space *space = (isl_space *) val;<br>
+       isl_ctx *ctx;<br>
+       uint32_t hash;<br>
+       struct isl_hash_table_entry *entry;<br>
+       isl_bool equal;<br>
+       PART *part;<br>
<br>
-       if (isl_space_is_params(space))<br>
-               return isl_space_is_set(part->dim);<br>
+       if (!u || !space)<br>
+               return NULL;<br>
<br>
-       return isl_space_tuple_is_equal(part->dim, isl_dim_in,<br>
-                                       space, isl_dim_set);<br>
+       ctx = FN(UNION,get_ctx)(u);<br>
+       hash = isl_space_get_domain_hash(space);<br>
+       entry = isl_hash_table_find(ctx, &u->table, hash,<br>
+                       &FN(UNION,has_same_domain_space), space, reserve);<br>
+       if (!entry)<br>
+               return reserve ? NULL : isl_hash_table_entry_none;<br>
+       if (reserve && !entry->data)<br>
+               return entry;<br>
+       part = entry->data;<br>
+       equal = isl_space_tuple_is_equal(part->dim, isl_dim_out,<br>
+                                           space, isl_dim_out);<br>
+       if (equal < 0)<br>
+               return NULL;<br>
+       if (equal)<br>
+               return entry;<br>
+       if (!reserve)<br>
+               return isl_hash_table_entry_none;<br>
+       isl_die(FN(UNION,get_ctx)(u), isl_error_invalid,<br>
+               "union expression can only contain a single "<br>
+               "expression over a given domain", return NULL);<br>
 }<br>
<br>
-/* Is the domain space of "entry" equal to the domain of "space"?<br>
+/* Remove "part_entry" from the hash table of "u".<br>
  */<br>
-static int FN(UNION,has_same_domain_space)(const void *entry, const void *val)<br>
+static __isl_give UNION *FN(UNION,remove_part_entry)(__isl_take UNION *u,<br>
+       struct isl_hash_table_entry *part_entry)<br>
 {<br>
-       PART *part = (PART *)entry;<br>
-       isl_space *space = (isl_space *) val;<br>
+       isl_ctx *ctx;<br>
<br>
-       if (isl_space_is_set(space))<br>
-               return isl_space_is_set(part->dim);<br>
+       if (!u || !part_entry)<br>
+               return FN(UNION,free)(u);<br>
<br>
-       return isl_space_tuple_is_equal(part->dim, isl_dim_in,<br>
-                                       space, isl_dim_in);<br>
+       ctx = FN(UNION,get_ctx)(u);<br>
+       isl_hash_table_remove(ctx, &u->table, part_entry);<br>
+       FN(PART,free)(part_entry->data);<br>
+<br>
+       return u;<br>
 }<br>
<br>
 /* Extract the element of "u" living in "space" (ignoring parameters).<br>
@@ -202,7 +235,6 @@ static int FN(UNION,has_same_domain_spac<br>
 __isl_give PART *FN(FN(UNION,extract),PARTS)(__isl_keep UNION *u,<br>
        __isl_take isl_space *space)<br>
 {<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry;<br>
<br>
        if (!u || !space)<br>
@@ -216,10 +248,10 @@ __isl_give PART *FN(FN(UNION,extract),PA<br>
                        goto error;<br>
        }<br>
<br>
-       hash = isl_space_get_hash(space);<br>
-       entry = isl_hash_table_find(u->space->ctx, &u->table, hash,<br>
-                                   &FN(UNION,has_space), space, 0);<br>
+       entry = FN(UNION,find_part_entry)(u, space, 0);<br>
        if (!entry)<br>
+               goto error;<br>
+       if (entry == isl_hash_table_entry_none)<br>
 #ifdef HAS_TYPE<br>
                return FN(PART,ZERO)(space, u->type);<br>
 #else<br>
@@ -242,7 +274,6 @@ static __isl_give UNION *FN(UNION,add_pa<br>
        __isl_take PART *part, int disjoint)<br>
 {<br>
        int empty;<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry;<br>
<br>
        if (!part)<br>
@@ -264,26 +295,17 @@ static __isl_give UNION *FN(UNION,add_pa<br>
        if (!u)<br>
                goto error;<br>
<br>
-       hash = isl_space_get_hash(part->dim);<br>
-       entry = isl_hash_table_find(u->space->ctx, &u->table, hash,<br>
-                                   &FN(UNION,has_same_domain_space),<br>
-                                   part->dim, 1);<br>
+       entry = FN(UNION,find_part_entry)(u, part->dim, 1);<br>
        if (!entry)<br>
                goto error;<br>
<br>
        if (!entry->data)<br>
                entry->data = part;<br>
        else {<br>
-               PART *entry_part = entry->data;<br>
                if (disjoint)<br>
                        isl_die(FN(UNION,get_ctx)(u), isl_error_invalid,<br>
                                "additional part should live on separate "<br>
                                "space", goto error);<br>
-               if (!isl_space_tuple_is_equal(entry_part->dim, isl_dim_out,<br>
-                                               part->dim, isl_dim_out))<br>
-                       isl_die(FN(UNION,get_ctx)(u), isl_error_invalid,<br>
-                               "union expression can only contain a single "<br>
-                               "expression over a given domain", goto error);<br>
                entry->data = FN(PART,union_add_)(entry->data,<br>
                                                FN(PART,copy)(part));<br>
                if (!entry->data)<br>
@@ -291,10 +313,8 @@ static __isl_give UNION *FN(UNION,add_pa<br>
                empty = FN(PART,IS_ZERO)(part);<br>
                if (empty < 0)<br>
                        goto error;<br>
-               if (empty) {<br>
-                       FN(PART,free)(entry->data);<br>
-                       isl_hash_table_remove(u->space->ctx, &u->table, entry);<br>
-               }<br>
+               if (empty)<br>
+                       u = FN(UNION,remove_part_entry)(u, entry);<br>
                FN(PART,free)(part);<br>
        }<br>
<br>
@@ -314,33 +334,114 @@ __isl_give UNION *FN(FN(UNION,add),PARTS<br>
        return FN(UNION,add_part_generic)(u, part, 1);<br>
 }<br>
<br>
-static isl_stat FN(UNION,add_part)(__isl_take PART *part, void *user)<br>
+#ifdef HAS_TYPE<br>
+/* Allocate a UNION with the same type and the same size as "u" and<br>
+ * with space "space".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,alloc_same_size_on_space)(__isl_keep UNION *u,<br>
+       __isl_take isl_space *space)<br>
 {<br>
-       UNION **u = (UNION **)user;<br>
+       if (!u)<br>
+               space = isl_space_free(space);<br>
+       return FN(UNION,alloc)(space, u->type, u->table.n);<br>
+}<br>
+#else<br>
+/* Allocate a UNION with the same size as "u" and with space "space".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,alloc_same_size_on_space)(__isl_keep UNION *u,<br>
+       __isl_take isl_space *space)<br>
+{<br>
+       if (!u)<br>
+               space = isl_space_free(space);<br>
+       return FN(UNION,alloc)(space, u->table.n);<br>
+}<br>
+#endif<br>
<br>
-       *u = FN(FN(UNION,add),PARTS)(*u, part);<br>
+/* Allocate a UNION with the same space, the same type (if any) and<br>
+ * the same size as "u".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,alloc_same_size)(__isl_keep UNION *u)<br>
+{<br>
+       return FN(UNION,alloc_same_size_on_space)(u, FN(UNION,get_space)(u));<br>
+}<br>
+<br>
+/* Call "fn" on each part entry of "u".<br>
+ */<br>
+static isl_stat FN(UNION,foreach_inplace)(__isl_keep UNION *u,<br>
+       isl_stat (*fn)(void **part, void *user), void *user)<br>
+{<br>
+       isl_ctx *ctx;<br>
+<br>
+       if (!u)<br>
+               return isl_stat_error;<br>
+       ctx = FN(UNION,get_ctx)(u);<br>
+       return isl_hash_table_foreach(ctx, &u->table, fn, user);<br>
+}<br>
+<br>
+/* Internal data structure for isl_union_*_transform_space.<br>
+ * "fn' is applied to each entry in the input.<br>
+ * "res" collects the results.<br>
+ */<br>
+S(UNION,transform_data)<br>
+{<br>
+       __isl_give PART *(*fn)(__isl_take PART *part, void *user);<br>
+       void *user;<br>
+<br>
+       UNION *res;<br>
+};<br>
+<br>
+/* Apply data->fn to "part" and add the result to data->res.<br>
+ */<br>
+static isl_stat FN(UNION,transform_entry)(__isl_take PART *part, void *user)<br>
+{<br>
+       S(UNION,transform_data) *data = (S(UNION,transform_data) *)user;<br>
+<br>
+       part = data->fn(part, data->user);<br>
+       data->res = FN(FN(UNION,add),PARTS)(data->res, part);<br>
+       if (!data->res)<br>
+               return isl_stat_error;<br>
<br>
        return isl_stat_ok;<br>
 }<br>
<br>
-__isl_give UNION *FN(UNION,dup)(__isl_keep UNION *u)<br>
+/* Return a UNION living in "space" that is obtained by applying "fn"<br>
+ * to each of the entries in "u".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,transform_space)(__isl_take UNION *u,<br>
+       isl_space *space,<br>
+       __isl_give PART *(*fn)(__isl_take PART *part, void *user), void *user)<br>
 {<br>
-       UNION *dup;<br>
+       S(UNION,transform_data) data = { fn, user };<br>
<br>
-       if (!u)<br>
-               return NULL;<br>
+       data.res = FN(UNION,alloc_same_size_on_space)(u, space);<br>
+       if (FN(FN(UNION,foreach),PARTS)(u,<br>
+                                       &FN(UNION,transform_entry), &data) < 0)<br>
+               data.res = FN(UNION,free)(data.res);<br>
+       FN(UNION,free)(u);<br>
+       return data.res;<br>
+}<br>
<br>
-#ifdef HAS_TYPE<br>
-       dup = FN(UNION,ZERO)(isl_space_copy(u->space), u->type);<br>
-#else<br>
-       dup = FN(UNION,ZERO)(isl_space_copy(u->space));<br>
-#endif<br>
-       if (FN(FN(UNION,foreach),PARTS)(u, &FN(UNION,add_part), &dup) < 0)<br>
-               goto error;<br>
-       return dup;<br>
-error:<br>
-       FN(UNION,free)(dup);<br>
-       return NULL;<br>
+/* Return a UNION that lives in the same space as "u" and that is obtained<br>
+ * by applying "fn" to each of the entries in "u".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,transform)(__isl_take UNION *u,<br>
+       __isl_give PART *(*fn)(__isl_take PART *part, void *user), void *user)<br>
+{<br>
+       return FN(UNION,transform_space)(u, FN(UNION,get_space)(u), fn, user);<br>
+}<br>
+<br>
+/* An isl_union_*_transform callback for use in isl_union_*_dup<br>
+ * that simply returns "part".<br>
+ */<br>
+static __isl_give PART *FN(UNION,copy_part)(__isl_take PART *part, void *user)<br>
+{<br>
+       return part;<br>
+}<br>
+<br>
+__isl_give UNION *FN(UNION,dup)(__isl_keep UNION *u)<br>
+{<br>
+       u = FN(UNION,copy)(u);<br>
+       return FN(UNION,transform)(u, &FN(UNION,copy_part), NULL);<br>
 }<br>
<br>
 __isl_give UNION *FN(UNION,cow)(__isl_take UNION *u)<br>
@@ -377,23 +478,13 @@ __isl_null UNION *FN(UNION,free)(__isl_t<br>
        return NULL;<br>
 }<br>
<br>
-S(UNION,align) {<br>
-       isl_reordering *exp;<br>
-       UNION *res;<br>
-};<br>
-<br>
-static isl_stat FN(UNION,align_entry)(__isl_take PART *part, void *user)<br>
+static __isl_give PART *FN(UNION,align_entry)(__isl_take PART *part, void *user)<br>
 {<br>
-       isl_reordering *exp;<br>
-       S(UNION,align) *data = user;<br>
+       isl_reordering *exp = user;<br>
<br>
-       exp = isl_reordering_extend_space(isl_reordering_copy(data->exp),<br>
+       exp = isl_reordering_extend_space(isl_reordering_copy(exp),<br>
                                    FN(PART,get_domain_space)(part));<br>
-<br>
-       data->res = FN(FN(UNION,add),PARTS)(data->res,<br>
-                                           FN(PART,realign_domain)(part, exp));<br>
-<br>
-       return isl_stat_ok;<br>
+       return FN(PART,realign_domain)(part, exp);<br>
 }<br>
<br>
 /* Reorder the parameters of "u" according to the given reordering.<br>
@@ -401,23 +492,15 @@ static isl_stat FN(UNION,align_entry)(__<br>
 static __isl_give UNION *FN(UNION,realign_domain)(__isl_take UNION *u,<br>
        __isl_take isl_reordering *r)<br>
 {<br>
-       S(UNION,align) data = { NULL, NULL };<br>
+       isl_space *space;<br>
<br>
        if (!u || !r)<br>
                goto error;<br>
<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(r->dim), u->type, u->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(r->dim), u->table.n);<br>
-#endif<br>
-       data.exp = r;<br>
-       if (FN(FN(UNION,foreach),PARTS)(u, &FN(UNION,align_entry), &data) < 0)<br>
-               data.res = FN(UNION,free)(data.res);<br>
-<br>
-       isl_reordering_free(data.exp);<br>
-       FN(UNION,free)(u);<br>
-       return data.res;<br>
+       space = isl_space_copy(r->dim);<br>
+       u = FN(UNION,transform_space)(u, space, &FN(UNION,align_entry), r);<br>
+       isl_reordering_free(r);<br>
+       return u;<br>
 error:<br>
        FN(UNION,free)(u);<br>
        isl_reordering_free(r);<br>
@@ -529,19 +612,17 @@ S(UNION,match_bin_data) {<br>
 static isl_stat FN(UNION,match_bin_entry)(void **entry, void *user)<br>
 {<br>
        S(UNION,match_bin_data) *data = user;<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry2;<br>
        isl_space *space;<br>
        PART *part = *entry;<br>
        PART *part2;<br>
<br>
        space = FN(PART,get_space)(part);<br>
-       hash = isl_space_get_hash(space);<br>
-       entry2 = isl_hash_table_find(data->u2->space->ctx, &data->u2->table,<br>
-                                    hash, &FN(UNION,has_same_domain_space),<br>
-                                    space, 0);<br>
+       entry2 = FN(UNION,find_part_entry)(data->u2, space, 0);<br>
        isl_space_free(space);<br>
        if (!entry2)<br>
+               return isl_stat_error;<br>
+       if (entry2 == isl_hash_table_entry_none)<br>
                return isl_stat_ok;<br>
<br>
        part2 = entry2->data;<br>
@@ -584,12 +665,7 @@ static __isl_give UNION *FN(UNION,match_<br>
                goto error;<br>
<br>
        data.u2 = u2;<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u1->space), u1->type,<br>
-                                   u1->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u1->space), u1->table.n);<br>
-#endif<br>
+       data.res = FN(UNION,alloc_same_size)(u1);<br>
        if (isl_hash_table_foreach(u1->space->ctx, &u1->table,<br>
                                    &FN(UNION,match_bin_entry), &data) < 0)<br>
                goto error;<br>
@@ -630,23 +706,15 @@ __isl_give UNION *FN(UNION,sub)(__isl_ta<br>
<br>
 S(UNION,any_set_data) {<br>
        isl_set *set;<br>
-       UNION *res;<br>
        __isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*);<br>
 };<br>
<br>
-static isl_stat FN(UNION,any_set_entry)(void **entry, void *user)<br>
+static __isl_give PART *FN(UNION,any_set_entry)(__isl_take PART *part,<br>
+       void *user)<br>
 {<br>
        S(UNION,any_set_data) *data = user;<br>
-       PW *pw = *entry;<br>
-<br>
-       pw = FN(PW,copy)(pw);<br>
-       pw = data->fn(pw, isl_set_copy(data->set));<br>
-<br>
-       data->res = FN(FN(UNION,add),PARTS)(data->res, pw);<br>
-       if (!data->res)<br>
-               return isl_stat_error;<br>
<br>
-       return isl_stat_ok;<br>
+       return data->fn(part, isl_set_copy(data->set));<br>
 }<br>
<br>
 /* Update each element of "u" by calling "fn" on the element and "set".<br>
@@ -655,7 +723,7 @@ static __isl_give UNION *FN(UNION,any_se<br>
        __isl_take isl_set *set,<br>
        __isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*))<br>
 {<br>
-       S(UNION,any_set_data) data = { NULL, NULL, fn };<br>
+       S(UNION,any_set_data) data = { NULL, fn };<br>
<br>
        u = FN(UNION,align_params)(u, isl_set_get_space(set));<br>
        set = isl_set_align_params(set, FN(UNION,get_space)(u));<br>
@@ -664,23 +732,12 @@ static __isl_give UNION *FN(UNION,any_se<br>
                goto error;<br>
<br>
        data.set = set;<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->type,<br>
-                                       u->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->table.n);<br>
-#endif<br>
-       if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
-                                  &FN(UNION,any_set_entry), &data) < 0)<br>
-               goto error;<br>
-<br>
-       FN(UNION,free)(u);<br>
+       u = FN(UNION,transform)(u, &FN(UNION,any_set_entry), &data);<br>
        isl_set_free(set);<br>
-       return data.res;<br>
+       return u;<br>
 error:<br>
        FN(UNION,free)(u);<br>
        isl_set_free(set);<br>
-       FN(UNION,free)(data.res);<br>
        return NULL;<br>
 }<br>
<br>
@@ -762,12 +819,7 @@ static __isl_give UNION *FN(UNION,match_<br>
                goto error;<br>
<br>
        data.uset = uset;<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->type,<br>
-                                       u->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->table.n);<br>
-#endif<br>
+       data.res = FN(UNION,alloc_same_size)(u);<br>
        if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
                                   &FN(UNION,match_domain_entry), &data) < 0)<br>
                goto error;<br>
@@ -795,31 +847,20 @@ __isl_give UNION *FN(UNION,intersect_dom<br>
        return FN(UNION,match_domain_op)(u, uset, &FN(PW,intersect_domain));<br>
 }<br>
<br>
-/* Internal data structure for isl_union_*_subtract_domain.<br>
- * uset is the set that needs to be removed from the domain.<br>
- * res collects the results.<br>
- */<br>
-S(UNION,subtract_domain_data) {<br>
-       isl_union_set *uset;<br>
-       UNION *res;<br>
-};<br>
-<br>
 /* Take the set (which may be empty) in data->uset that lives<br>
  * in the same space as the domain of "pw", subtract it from the domain<br>
- * of "pw" and add the result to data->res.<br>
+ * of "part" and return the result.<br>
  */<br>
-static isl_stat FN(UNION,subtract_domain_entry)(__isl_take PW *pw, void *user)<br>
+static __isl_give PART *FN(UNION,subtract_domain_entry)(__isl_take PART *part,<br>
+       void *user)<br>
 {<br>
-       S(UNION,subtract_domain_data) *data = user;<br>
+       isl_union_set *uset = user;<br>
        isl_space *space;<br>
        isl_set *set;<br>
<br>
-       space = FN(PW,get_domain_space)(pw);<br>
-       set = isl_union_set_extract_set(data->uset, space);<br>
-       pw = FN(PW,subtract_domain)(pw, set);<br>
-       data->res = FN(FN(UNION,add),PARTS)(data->res, pw);<br>
-<br>
-       return isl_stat_ok;<br>
+       space = FN(PART,get_domain_space)(part);<br>
+       set = isl_union_set_extract_set(uset, space);<br>
+       return FN(PART,subtract_domain)(part, set);<br>
 }<br>
<br>
 /* Subtract "uset' from the domain of "u".<br>
@@ -827,29 +868,9 @@ static isl_stat FN(UNION,subtract_domain<br>
 __isl_give UNION *FN(UNION,subtract_domain)(__isl_take UNION *u,<br>
        __isl_take isl_union_set *uset)<br>
 {<br>
-       S(UNION,subtract_domain_data) data;<br>
-<br>
-       if (!u || !uset)<br>
-               goto error;<br>
-<br>
-       data.uset = uset;<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->type,<br>
-                                       u->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->table.n);<br>
-#endif<br>
-       if (FN(FN(UNION,foreach),PARTS)(u,<br>
-                               &FN(UNION,subtract_domain_entry), &data) < 0)<br>
-               data.res = FN(UNION,free)(data.res);<br>
-<br>
-       FN(UNION,free)(u);<br>
+       u = FN(UNION,transform)(u, &FN(UNION,subtract_domain_entry), uset);<br>
        isl_union_set_free(uset);<br>
-       return data.res;<br>
-error:<br>
-       FN(UNION,free)(u);<br>
-       isl_union_set_free(uset);<br>
-       return NULL;<br>
+       return u;<br>
 }<br>
<br>
 __isl_give UNION *FN(UNION,gist)(__isl_take UNION *u,<br>
@@ -860,59 +881,28 @@ __isl_give UNION *FN(UNION,gist)(__isl_t<br>
        return FN(UNION,match_domain_op)(u, uset, &FN(PW,gist));<br>
 }<br>
<br>
-#ifndef NO_EVAL<br>
-__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u,<br>
-       __isl_take isl_point *pnt)<br>
-{<br>
-       uint32_t hash;<br>
-       struct isl_hash_table_entry *entry;<br>
-       isl_space *space;<br>
-       isl_val *v;<br>
-<br>
-       if (!u || !pnt)<br>
-               goto error;<br>
-<br>
-       space = isl_space_copy(pnt->dim);<br>
-       if (!space)<br>
-               goto error;<br>
-       hash = isl_space_get_hash(space);<br>
-       entry = isl_hash_table_find(u->space->ctx, &u->table,<br>
-                                   hash, &FN(UNION,has_domain_space),<br>
-                                   space, 0);<br>
-       isl_space_free(space);<br>
-       if (!entry) {<br>
-               v = isl_val_zero(isl_point_get_ctx(pnt));<br>
-               isl_point_free(pnt);<br>
-       } else {<br>
-               v = FN(PART,eval)(FN(PART,copy)(entry->data), pnt);<br>
-       }<br>
-       FN(UNION,free)(u);<br>
-       return v;<br>
-error:<br>
-       FN(UNION,free)(u);<br>
-       isl_point_free(pnt);<br>
-       return NULL;<br>
-}<br>
-#endif<br>
-<br>
+/* Coalesce an entry in a UNION.  Coalescing is performed in-place.<br>
+ * Since the UNION may have several references, the entry is only<br>
+ * replaced if the coalescing is successful.<br>
+ */<br>
 static isl_stat FN(UNION,coalesce_entry)(void **entry, void *user)<br>
 {<br>
-       PW **pw = (PW **)entry;<br>
+       PART **part_p = (PART **) entry;<br>
+       PART *part;<br>
<br>
-       *pw = FN(PW,coalesce)(*pw);<br>
-       if (!*pw)<br>
+       part = FN(PART,copy)(*part_p);<br>
+       part = FN(PW,coalesce)(part);<br>
+       if (!part)<br>
                return isl_stat_error;<br>
+       FN(PART,free)(*part_p);<br>
+       *part_p = part;<br>
<br>
        return isl_stat_ok;<br>
 }<br>
<br>
 __isl_give UNION *FN(UNION,coalesce)(__isl_take UNION *u)<br>
 {<br>
-       if (!u)<br>
-               return NULL;<br>
-<br>
-       if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
-                                  &FN(UNION,coalesce_entry), NULL) < 0)<br>
+       if (FN(UNION,foreach_inplace)(u, &FN(UNION,coalesce_entry), NULL) < 0)<br>
                goto error;<br>
<br>
        return u;<br>
@@ -947,6 +937,27 @@ error:<br>
        return NULL;<br>
 }<br>
<br>
+#ifdef HAS_TYPE<br>
+/* Negate the type of "u".<br>
+ */<br>
+static __isl_give UNION *FN(UNION,negate_type)(__isl_take UNION *u)<br>
+{<br>
+       u = FN(UNION,cow)(u);<br>
+       if (!u)<br>
+               return NULL;<br>
+       u->type = isl_fold_type_negate(u->type);<br>
+       return u;<br>
+}<br>
+#else<br>
+/* Negate the type of "u".<br>
+ * Since "u" does not have a type, do nothing.<br>
+ */<br>
+static __isl_give UNION *FN(UNION,negate_type)(__isl_take UNION *u)<br>
+{<br>
+       return u;<br>
+}<br>
+#endif<br>
+<br>
 static isl_stat FN(UNION,mul_isl_int_entry)(void **entry, void *user)<br>
 {<br>
        PW **pw = (PW **)entry;<br>
@@ -977,13 +988,11 @@ __isl_give UNION *FN(UNION,mul_isl_int)(<br>
        }<br>
<br>
        u = FN(UNION,cow)(u);<br>
+       if (isl_int_is_neg(v))<br>
+               u = FN(UNION,negate_type)(u);<br>
        if (!u)<br>
                return NULL;<br>
<br>
-#ifdef HAS_TYPE<br>
-       if (isl_int_is_neg(v))<br>
-               u->type = isl_fold_type_negate(u->type);<br>
-#endif<br>
        if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
                                    &FN(UNION,mul_isl_int_entry), &v) < 0)<br>
                goto error;<br>
@@ -1040,13 +1049,11 @@ __isl_give UNION *FN(UNION,scale_val)(__<br>
                        "expecting rational factor", goto error);<br>
<br>
        u = FN(UNION,cow)(u);<br>
+       if (isl_val_is_neg(v))<br>
+               u = FN(UNION,negate_type)(u);<br>
        if (!u)<br>
                return NULL;<br>
<br>
-#ifdef HAS_TYPE<br>
-       if (isl_val_is_neg(v))<br>
-               u->type = isl_fold_type_negate(u->type);<br>
-#endif<br>
        if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
                                    &FN(UNION,scale_val_entry), v) < 0)<br>
                goto error;<br>
@@ -1095,13 +1102,11 @@ __isl_give UNION *FN(UNION,scale_down_va<br>
                        "cannot scale down by zero", goto error);<br>
<br>
        u = FN(UNION,cow)(u);<br>
+       if (isl_val_is_neg(v))<br>
+               u = FN(UNION,negate_type)(u);<br>
        if (!u)<br>
                return NULL;<br>
<br>
-#ifdef HAS_TYPE<br>
-       if (isl_val_is_neg(v))<br>
-               u->type = isl_fold_type_negate(u->type);<br>
-#endif<br>
        if (isl_hash_table_foreach(FN(UNION,get_ctx)(u), &u->table,<br>
                                    &FN(UNION,scale_down_val_entry), v) < 0)<br>
                goto error;<br>
@@ -1123,16 +1128,15 @@ S(UNION,plain_is_equal_data)<br>
 static isl_stat FN(UNION,plain_is_equal_entry)(void **entry, void *user)<br>
 {<br>
        S(UNION,plain_is_equal_data) *data = user;<br>
-       uint32_t hash;<br>
        struct isl_hash_table_entry *entry2;<br>
        PW *pw = *entry;<br>
<br>
-       hash = isl_space_get_hash(pw->dim);<br>
-       entry2 = isl_hash_table_find(data->u2->space->ctx, &data->u2->table,<br>
-                                    hash, &FN(UNION,has_same_domain_space),<br>
-                                    pw->dim, 0);<br>
-       if (!entry2) {<br>
-               data->is_equal = isl_bool_false;<br>
+       entry2 = FN(UNION,find_part_entry)(data->u2, pw->dim, 0);<br>
+       if (!entry2 || entry2 == isl_hash_table_entry_none) {<br>
+               if (!entry2)<br>
+                       data->is_equal = isl_bool_error;<br>
+               else<br>
+                       data->is_equal = isl_bool_false;<br>
                return isl_stat_error;<br>
        }<br>
<br>
@@ -1162,7 +1166,7 @@ isl_bool FN(UNION,plain_is_equal)(__isl_<br>
                goto error;<br>
<br>
        data.u2 = u2;<br>
-       if (isl_hash_table_foreach(u1->space->ctx, &u1->table,<br>
+       if (FN(UNION,foreach_inplace)(u1,<br>
                               &FN(UNION,plain_is_equal_entry), &data) < 0 &&<br>
            data.is_equal)<br>
                goto error;<br>
@@ -1177,61 +1181,23 @@ error:<br>
        return isl_bool_error;<br>
 }<br>
<br>
-#ifndef NO_NEG<br>
-/* Replace *entry by its opposite.<br>
- *<br>
- * Return 0 on success and -1 on error.<br>
- */<br>
-static isl_stat FN(UNION,neg_entry)(void **entry, void *user)<br>
-{<br>
-       PW **pw = (PW **) entry;<br>
-<br>
-       *pw = FN(PW,neg)(*pw);<br>
-<br>
-       return *pw ? isl_stat_ok : isl_stat_error;<br>
-}<br>
-<br>
-/* Return the opposite of "u".<br>
- */<br>
-__isl_give UNION *FN(UNION,neg)(__isl_take UNION *u)<br>
-{<br>
-       u = FN(UNION,cow)(u);<br>
-       if (!u)<br>
-               return NULL;<br>
-<br>
-       if (isl_hash_table_foreach(u->space->ctx, &u->table,<br>
-                                  &FN(UNION,neg_entry), NULL) < 0)<br>
-               return FN(UNION,free)(u);<br>
-<br>
-       return u;<br>
-}<br>
-#endif<br>
-<br>
 /* Internal data structure for isl_union_*_drop_dims.<br>
  * type, first and n are passed to isl_*_drop_dims.<br>
- * res collects the results.<br>
  */<br>
 S(UNION,drop_dims_data) {<br>
        enum isl_dim_type type;<br>
        unsigned first;<br>
        unsigned n;<br>
-<br>
-       UNION *res;<br>
 };<br>
<br>
-/* Drop the parameters specified by "data" from "part" and<br>
- * add the results to data->res.<br>
+/* Drop the parameters specified by "data" from "part" and return the result.<br>
  */<br>
-static isl_stat FN(UNION,drop_dims_entry)(__isl_take PART *part, void *user)<br>
+static __isl_give PART *FN(UNION,drop_dims_entry)(__isl_take PART *part,<br>
+       void *user)<br>
 {<br>
        S(UNION,drop_dims_data) *data = user;<br>
<br>
-       part = FN(PART,drop_dims)(part, data->type, data->first, data->n);<br>
-       data->res = FN(FN(UNION,add),PARTS)(data->res, part);<br>
-       if (!data->res)<br>
-               return isl_stat_error;<br>
-<br>
-       return isl_stat_ok;<br>
+       return FN(PART,drop_dims)(part, data->type, data->first, data->n);<br>
 }<br>
<br>
 /* Drop the specified parameters from "u".<br>
@@ -1253,45 +1219,28 @@ __isl_give UNION *FN(UNION,drop_dims)( _<br>
<br>
        space = FN(UNION,get_space)(u);<br>
        space = isl_space_drop_dims(space, type, first, n);<br>
-#ifdef HAS_TYPE<br>
-       data.res = FN(UNION,alloc)(space, u->type, u->table.n);<br>
-#else<br>
-       data.res = FN(UNION,alloc)(space, u->table.n);<br>
-#endif<br>
-       if (FN(FN(UNION,foreach),PARTS)(u,<br>
-                                       &FN(UNION,drop_dims_entry), &data) < 0)<br>
-               data.res = FN(UNION,free)(data.res);<br>
-<br>
-       FN(UNION,free)(u);<br>
-<br>
-       return data.res;<br>
+       return FN(UNION,transform_space)(u, space, &FN(UNION,drop_dims_entry),<br>
+                                       &data);<br>
 }<br>
<br>
 /* Internal data structure for isl_union_*_set_dim_name.<br>
  * pos is the position of the parameter that needs to be renamed.<br>
  * s is the new name.<br>
- * res collects the results.<br>
  */<br>
 S(UNION,set_dim_name_data) {<br>
        unsigned pos;<br>
        const char *s;<br>
-<br>
-       UNION *res;<br>
 };<br>
<br>
 /* Change the name of the parameter at position data->pos of "part" to data->s<br>
- * and add the result to data->res.<br>
+ * and return the result.<br>
  */<br>
-static isl_stat FN(UNION,set_dim_name_entry)(__isl_take PART *part, void *user)<br>
+static __isl_give PART *FN(UNION,set_dim_name_entry)(__isl_take PART *part,<br>
+       void *user)<br>
 {<br>
        S(UNION,set_dim_name_data) *data = use</blockquote></div></div>