add isl_map_move
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Mar 2010 09:01:54 +0000 (10:01 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Mar 2010 18:04:56 +0000 (19:04 +0100)
Makefile.am
include/isl_map.h
include/isl_set.h
isl_dim.c
isl_dim_private.h [new file with mode: 0644]
isl_map.c

index d1d04bd..f2ce297 100644 (file)
@@ -40,6 +40,7 @@ libisl_la_SOURCES = \
        isl_constraint.c \
        isl_convex_hull.c \
        isl_ctx.c \
+       isl_dim_private.h \
        isl_dim.c \
        isl_div.c \
        isl_equalities.c \
index a05b92e..bd39e61 100644 (file)
@@ -315,6 +315,9 @@ __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(__isl_take isl_map *map,
                enum isl_dim_type type, unsigned n);
+__isl_give isl_map *isl_map_move(__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);
index fcd99b3..772839e 100644 (file)
@@ -239,6 +239,9 @@ __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(__isl_take isl_set *set,
                enum isl_dim_type type, unsigned n);
+__isl_give isl_set *isl_set_move(__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);
index 078a0a8..c364c8b 100644 (file)
--- a/isl_dim.c
+++ b/isl_dim.c
@@ -7,7 +7,7 @@
  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
  */
 
-#include "isl_dim.h"
+#include <isl_dim_private.h>
 #include "isl_name.h"
 
 struct isl_dim *isl_dim_alloc(struct isl_ctx *ctx,
@@ -344,6 +344,49 @@ struct isl_dim *isl_dim_add(struct isl_dim *dim, enum isl_dim_type type,
        return dim;
 }
 
+__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)
+{
+       if (!dim)
+               return NULL;
+       if (n == 0)
+               return dim;
+
+       isl_assert(dim->ctx, src_pos + n <= isl_dim_size(dim, src_type),
+               goto error);
+
+       /* just the simple case for now */
+       isl_assert(dim->ctx,
+               offset(dim, dst_type) + dst_pos ==
+               offset(dim, src_type) + src_pos + ((src_type < dst_type) ? n : 0),
+               goto error);
+
+       if (dst_type == src_type)
+               return dim;
+
+       dim = isl_dim_cow(dim);
+       if (!dim)
+               return NULL;
+
+       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;
+       }
+
+       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;
+       }
+
+       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;
diff --git a/isl_dim_private.h b/isl_dim_private.h
new file mode 100644 (file)
index 0000000..14f7a79
--- /dev/null
@@ -0,0 +1,5 @@
+#include <isl_dim.h>
+
+__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);
index e290420..abee9b9 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -26,6 +26,7 @@
 #include "isl_sample.h"
 #include "isl_tab.h"
 #include "isl_vec.h"
+#include <isl_dim_private.h>
 
 /* Maps dst positions to src positions */
 struct isl_dim_map {
@@ -2057,6 +2058,101 @@ error:
        return NULL;
 }
 
+__isl_give isl_basic_map *isl_basic_map_move(__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)
+{
+       int i;
+
+       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);
+
+       /* just the simple case for now */
+       isl_assert(bmap->ctx,
+           pos(bmap->dim, dst_type) + dst_pos ==
+           pos(bmap->dim, src_type) + src_pos + ((src_type < dst_type) ? n : 0),
+           goto error);
+
+       if (dst_type == src_type)
+               return bmap;
+
+       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;
+
+       return bmap;
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
+__isl_give isl_set *isl_set_move(__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((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(__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);
+
+       /* just the simple case for now */
+       isl_assert(map->ctx,
+           map_offset(map, dst_type) + dst_pos ==
+           map_offset(map, src_type) + src_pos + ((src_type < dst_type) ? n : 0),
+           goto error);
+
+       if (dst_type == src_type)
+               return map;
+
+       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(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.