extract out isl_basic_map_implicit_equalities from isl_basic_map_affine_hull
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 14 Aug 2008 14:47:36 +0000 (16:47 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 25 Aug 2008 08:15:07 +0000 (10:15 +0200)
include/isl_map.h
isl_affine_hull.c
isl_map.c

index e78580c..8aa8086 100644 (file)
@@ -38,6 +38,7 @@ 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)
        unsigned flags;
 
        unsigned nparam;
index f2c6761..13a53ca 100644 (file)
@@ -5,15 +5,19 @@
 #include "isl_map.h"
 #include "isl_map_private.h"
 
-struct isl_basic_map *isl_basic_map_affine_hull(struct isl_ctx *ctx,
+struct isl_basic_map *isl_basic_map_implicit_equalities(struct isl_ctx *ctx,
                                                struct isl_basic_map *bmap)
 {
        int i;
        isl_int opt;
 
-       bmap = isl_basic_map_cow(ctx, bmap);
        if (!bmap)
-               return NULL;
+               return bmap;
+
+       if (F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
+               return bmap;
+       if (F_ISSET(bmap, ISL_BASIC_MAP_NO_IMPLICIT))
+               return bmap;
 
        isl_int_init(opt);
        for (i = 0; i < bmap->n_ineq; ++i) {
@@ -33,15 +37,31 @@ struct isl_basic_map *isl_basic_map_affine_hull(struct isl_ctx *ctx,
                        --i;
                }
        }
-       isl_basic_map_free_inequality(ctx, bmap, bmap->n_ineq);
        isl_int_clear(opt);
-       return isl_basic_map_finalize(ctx, bmap);
+
+       F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
+       return bmap;
 error:
        isl_int_clear(opt);
        isl_basic_map_free(ctx, bmap);
        return NULL;
 }
 
+struct isl_basic_map *isl_basic_map_affine_hull(struct isl_ctx *ctx,
+                                               struct isl_basic_map *bmap)
+{
+       bmap = isl_basic_map_implicit_equalities(ctx, bmap);
+       if (!bmap)
+               return NULL;
+       if (bmap->n_ineq == 0)
+               return bmap;
+       bmap = isl_basic_map_cow(ctx, bmap);
+       if (!bmap)
+               return NULL;
+       isl_basic_map_free_inequality(ctx, bmap, bmap->n_ineq);
+       return isl_basic_map_finalize(ctx, bmap);
+}
+
 struct isl_basic_set *isl_basic_set_affine_hull(struct isl_ctx *ctx,
                                                struct isl_basic_set *bset)
 {
index 21a2fce..a0b5105 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -279,6 +279,7 @@ int isl_basic_map_alloc_inequality(struct isl_ctx *ctx,
 {
        isl_assert(ctx, (bmap->ineq - bmap->eq) + bmap->n_ineq < bmap->c_size,
                        return -1);
+       F_CLR(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
        return bmap->n_ineq++;
 }