+2015-09-09 Sebastian Pop <s.pop@samsung.com>
+
+ PR tree-optimization/53852
+ * config.in: Regenerate.
+ * configure: Regenerate.
+ * configure.ac (HAVE_ISL_CTX_MAX_OPERATIONS): Detect.
+ * graphite-optimize-isl.c (optimize_isl): Stop computation when
+ PARAM_MAX_ISL_OPERATIONS is reached.
+ * params.def (PARAM_MAX_ISL_OPERATIONS): Add.
+ * graphite-dependences.c (extend_schedule): Remove gcc_asserts on
+ result equal to isl_stat_ok as the status now can be isl_error_quota.
+ (subtract_commutative_associative_deps): Same.
+ (compute_deps): Same.
+
2015-09-08 Aditya Kumar <hiraditya@msn.com>
Sebastian Pop <s.pop@samsung.com>
#endif
+/* Define if isl_ctx_get_max_operations exists. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_ISL_CTX_MAX_OPERATIONS
+#endif
+
+
/* Define if isl_options_set_schedule_serialize_sccs exists. */
#ifndef USED_FOR_TARGET
#undef HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_isl_options_set_schedule_serialize_sccs" >&5
$as_echo "$ac_has_isl_options_set_schedule_serialize_sccs" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for isl_ctx_get_max_operations" >&5
+$as_echo_n "checking Checking for isl_ctx_get_max_operations... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <isl/ctx.h>
+int
+main ()
+{
+isl_ctx_get_max_operations (isl_ctx_alloc ());
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_has_isl_ctx_get_max_operations=yes
+else
+ ac_has_isl_ctx_get_max_operations=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_isl_ctx_get_max_operations" >&5
+$as_echo "$ac_has_isl_ctx_get_max_operations" >&6; }
+
LIBS="$saved_LIBS"
CXXFLAGS="$saved_CXXFLAGS"
$as_echo "#define HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS 1" >>confdefs.h
+ fi
+ if test x"$ac_has_isl_ctx_get_max_operations" = x"yes"; then
+
+$as_echo "#define HAVE_ISL_CTX_MAX_OPERATIONS 1" >>confdefs.h
+
fi
fi
[ac_has_isl_options_set_schedule_serialize_sccs=no])
AC_MSG_RESULT($ac_has_isl_options_set_schedule_serialize_sccs)
+ AC_MSG_CHECKING([Checking for isl_ctx_get_max_operations])
+ AC_TRY_LINK([#include <isl/ctx.h>],
+ [isl_ctx_get_max_operations (isl_ctx_alloc ());],
+ [ac_has_isl_ctx_get_max_operations=yes],
+ [ac_has_isl_ctx_get_max_operations=no])
+ AC_MSG_RESULT($ac_has_isl_ctx_get_max_operations)
+
LIBS="$saved_LIBS"
CXXFLAGS="$saved_CXXFLAGS"
AC_DEFINE(HAVE_ISL_OPTIONS_SET_SCHEDULE_SERIALIZE_SCCS, 1,
[Define if isl_options_set_schedule_serialize_sccs exists.])
fi
+ if test x"$ac_has_isl_ctx_get_max_operations" = x"yes"; then
+ AC_DEFINE(HAVE_ISL_CTX_MAX_OPERATIONS, 1,
+ [Define if isl_ctx_get_max_operations exists.])
+ fi
fi
GCC_ENABLE_PLUGINS
extend_schedule (__isl_take isl_union_map *x)
{
int max = 0;
- isl_stat res;
struct extend_schedule_str str;
- res = isl_union_map_foreach_map (x, max_number_of_out_dimensions, (void *) &max);
- gcc_assert (res == isl_stat_ok);
-
+ isl_union_map_foreach_map (x, max_number_of_out_dimensions, (void *) &max);
str.max = max;
str.umap = isl_union_map_empty (isl_union_map_get_space (x));
- res = isl_union_map_foreach_map (x, extend_schedule_1, (void *) &str);
- gcc_assert (res == isl_stat_ok);
-
+ isl_union_map_foreach_map (x, extend_schedule_1, (void *) &str);
isl_union_map_free (x);
return str.umap;
}
FOR_EACH_VEC_ELT (pbbs, i, pbb)
if (PBB_IS_REDUCTION (pbb))
{
- int res;
isl_union_map *r = isl_union_map_empty (isl_space_copy (space));
isl_union_map *must_w = isl_union_map_empty (isl_space_copy (space));
isl_union_map *may_w = isl_union_map_empty (isl_space_copy (space));
(isl_union_map_copy (must_w), isl_union_map_copy (may_w));
empty = isl_union_map_empty (isl_union_map_get_space (all_w));
- res = isl_union_map_compute_flow (isl_union_map_copy (r),
- isl_union_map_copy (must_w),
- isl_union_map_copy (may_w),
- isl_union_map_copy (original),
- &x_must_raw, &x_may_raw,
- &x_must_raw_no_source,
- &x_may_raw_no_source);
- gcc_assert (res == 0);
- res = isl_union_map_compute_flow (isl_union_map_copy (all_w),
- r, empty,
- isl_union_map_copy (original),
- &x_must_war, &x_may_war,
- &x_must_war_no_source,
- &x_may_war_no_source);
- gcc_assert (res == 0);
- res = isl_union_map_compute_flow (all_w, must_w, may_w,
- isl_union_map_copy (original),
- &x_must_waw, &x_may_waw,
- &x_must_waw_no_source,
- &x_may_waw_no_source);
- gcc_assert (res == 0);
+ isl_union_map_compute_flow (isl_union_map_copy (r),
+ isl_union_map_copy (must_w),
+ isl_union_map_copy (may_w),
+ isl_union_map_copy (original),
+ &x_must_raw, &x_may_raw,
+ &x_must_raw_no_source,
+ &x_may_raw_no_source);
+ isl_union_map_compute_flow (isl_union_map_copy (all_w),
+ r, empty,
+ isl_union_map_copy (original),
+ &x_must_war, &x_may_war,
+ &x_must_war_no_source,
+ &x_may_war_no_source);
+ isl_union_map_compute_flow (all_w, must_w, may_w,
+ isl_union_map_copy (original),
+ &x_must_waw, &x_may_waw,
+ &x_must_waw_no_source,
+ &x_may_waw_no_source);
if (must_raw)
*must_raw = isl_union_map_subtract (*must_raw, x_must_raw);
isl_space *space = isl_union_map_get_space (all_writes);
isl_union_map *empty = isl_union_map_empty (space);
isl_union_map *original = scop_get_original_schedule (scop, pbbs);
- int res;
- res = isl_union_map_compute_flow (isl_union_map_copy (reads),
- isl_union_map_copy (must_writes),
- isl_union_map_copy (may_writes),
- isl_union_map_copy (original),
- must_raw, may_raw, must_raw_no_source,
- may_raw_no_source);
- gcc_assert (res == 0);
- res = isl_union_map_compute_flow (isl_union_map_copy (all_writes),
- reads, empty,
- isl_union_map_copy (original),
- must_war, may_war, must_war_no_source,
- may_war_no_source);
- gcc_assert (res == 0);
- res = isl_union_map_compute_flow (all_writes, must_writes, may_writes,
- isl_union_map_copy (original),
- must_waw, may_waw, must_waw_no_source,
- may_waw_no_source);
- gcc_assert (res == 0);
+ isl_union_map_compute_flow (isl_union_map_copy (reads),
+ isl_union_map_copy (must_writes),
+ isl_union_map_copy (may_writes),
+ isl_union_map_copy (original),
+ must_raw, may_raw, must_raw_no_source,
+ may_raw_no_source);
+ isl_union_map_compute_flow (isl_union_map_copy (all_writes),
+ reads, empty,
+ isl_union_map_copy (original),
+ must_war, may_war, must_war_no_source,
+ may_war_no_source);
+ isl_union_map_compute_flow (all_writes, must_writes, may_writes,
+ isl_union_map_copy (original),
+ must_waw, may_waw, must_waw_no_source,
+ may_waw_no_source);
subtract_commutative_associative_deps
(scop, pbbs, original,
#include <isl/band.h>
#include <isl/aff.h>
#include <isl/options.h>
+#include <isl/ctx.h>
#include "system.h"
#include "coretypes.h"
bool
optimize_isl (scop_p scop)
{
-
- isl_schedule *schedule;
-#ifdef HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE
- isl_schedule_constraints *schedule_constraints;
+#ifdef HAVE_ISL_CTX_MAX_OPERATIONS
+ int old_max_operations = isl_ctx_get_max_operations(scop->ctx);
+ int max_operations = PARAM_VALUE (PARAM_MAX_ISL_OPERATIONS);
+ if (max_operations)
+ isl_ctx_set_max_operations(scop->ctx, max_operations);
#endif
- isl_union_set *domain;
- isl_union_map *validity, *proximity, *dependences;
- isl_union_map *schedule_map;
+ isl_options_set_on_error (scop->ctx, ISL_ON_ERROR_CONTINUE);
- domain = scop_get_domains (scop);
- dependences = scop_get_dependences (scop);
+ isl_union_set *domain = scop_get_domains (scop);
+ isl_union_map *dependences = scop_get_dependences (scop);
dependences = isl_union_map_gist_domain (dependences,
isl_union_set_copy (domain));
dependences = isl_union_map_gist_range (dependences,
isl_union_set_copy (domain));
- validity = dependences;
-
- proximity = isl_union_map_copy (validity);
+ isl_union_map *validity = dependences;
+ isl_union_map *proximity = isl_union_map_copy (validity);
#ifdef HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE
+ isl_schedule_constraints *schedule_constraints;
schedule_constraints = isl_schedule_constraints_on_domain (domain);
schedule_constraints
= isl_schedule_constraints_set_proximity (schedule_constraints,
#else
isl_options_set_schedule_fuse (scop->ctx, ISL_SCHEDULE_FUSE_MIN);
#endif
- isl_options_set_on_error (scop->ctx, ISL_ON_ERROR_CONTINUE);
#ifdef HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE
- schedule = isl_schedule_constraints_compute_schedule(schedule_constraints);
+ isl_schedule *schedule
+ = isl_schedule_constraints_compute_schedule (schedule_constraints);
#else
- schedule = isl_union_set_compute_schedule (domain, validity, proximity);
+ isl_schedule *schedule
+ = isl_union_set_compute_schedule (domain, validity, proximity);
#endif
isl_options_set_on_error (scop->ctx, ISL_ON_ERROR_ABORT);
+#ifdef HAVE_ISL_CTX_MAX_OPERATIONS
+ isl_ctx_reset_operations(scop->ctx);
+ isl_ctx_set_max_operations(scop->ctx, old_max_operations);
+ if (!schedule || isl_ctx_last_error (scop->ctx) == isl_error_quota)
+ {
+ if (dump_file && dump_flags)
+ fprintf (dump_file, "ISL timed out at %d operations\n",
+ max_operations);
+ if (schedule)
+ isl_schedule_free (schedule);
+ return false;
+ }
+#else
if (!schedule)
return false;
+#endif
- schedule_map = getScheduleMap (schedule);
-
+ isl_union_map *schedule_map = getScheduleMap (schedule);
apply_schedule_map_to_scop (scop, schedule_map);
isl_schedule_free (schedule);
isl_union_map_free (schedule_map);
-
return true;
}
"maximum number of basic blocks per function to be analyzed by Graphite",
100, 0, 0)
+DEFPARAM (PARAM_MAX_ISL_OPERATIONS,
+ "max-isl-operations",
+ "maximum number of ISL operations, 0 means unlimited",
+ 350000, 0, 0)
+
/* Avoid data dependence analysis on very large loops. */
DEFPARAM (PARAM_LOOP_MAX_DATAREFS_FOR_DATADEPS,
"loop-max-datarefs-for-datadeps",
+2015-09-09 Aditya Kumar <hiraditya@msn.com>
+ Sebastian Pop <s.pop@samsung.com>
+
+ PR tree-optimization/53852
+ * gcc.dg/graphite/uns-interchange-12.c: Adjust pattern to pass with
+ both isl-0.12 and isl-0.15.
+ * gcc.dg/graphite/uns-interchange-14.c: Same.
+ * gcc.dg/graphite/uns-interchange-15.c: Same.
+ * gcc.dg/graphite/uns-interchange-mvt.c: Same.
+
2015-09-08 Aditya Kumar <hiraditya@msn.com>
Sebastian Pop <s.pop@samsung.com>
return 0;
}
-/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
+/* { dg-final { scan-tree-dump "tiled by" "graphite" } } */
return 0;
}
-/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */
+/* { dg-final { scan-tree-dump "tiled by" "graphite" } } */
return 0;
}
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump "tiled by" "graphite" } } */
return 0;
}
-/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
+/* { dg-final { scan-tree-dump "tiled by" "graphite" } } */