summaryrefslogtreecommitdiff
path: root/isl_transitive_closure.c
diff options
context:
space:
mode:
authorSven Verdoolaege <skimo@kotnet.org>2010-04-28 23:45:49 +0200
committerSven Verdoolaege <skimo@kotnet.org>2010-04-28 23:45:49 +0200
commitbe518dd6c898e3f72d6e62aff2485bf6b68dbc38 (patch)
treed6d8163551f0f103cce5498841f68b646040d121 /isl_transitive_closure.c
parent6c91cdb13e82b6fb46bfa6988b8226ede35f9a31 (diff)
downloadisl-be518dd6c898e3f72d6e62aff2485bf6b68dbc38.tar.gz
isl-be518dd6c898e3f72d6e62aff2485bf6b68dbc38.tar.bz2
isl-be518dd6c898e3f72d6e62aff2485bf6b68dbc38.zip
isl_map_transitive_closure: check if input is closed already
Diffstat (limited to 'isl_transitive_closure.c')
-rw-r--r--isl_transitive_closure.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/isl_transitive_closure.c b/isl_transitive_closure.c
index 4767040e..5d6c9947 100644
--- a/isl_transitive_closure.c
+++ b/isl_transitive_closure.c
@@ -2387,6 +2387,18 @@ error:
return NULL;
}
+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;
+}
+
/* 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
@@ -2397,6 +2409,7 @@ __isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
int *exact)
{
unsigned param;
+ int closed;
if (!map)
goto error;
@@ -2404,6 +2417,15 @@ __isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
if (map->ctx->opt->closure == ISL_CLOSURE_OMEGA)
return transitive_closure_omega(map, exact);
+ closed = isl_map_is_transitively_closed(map);
+ if (closed < 0)
+ goto error;
+ if (closed) {
+ if (exact)
+ *exact = 1;
+ return map;
+ }
+
param = isl_map_dim(map, isl_dim_param);
map = map_power(map, param, exact, 1);