isl_stream_read_map: properly parse nested spaces
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 16 Oct 2010 12:50:59 +0000 (14:50 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 16 Oct 2010 13:02:40 +0000 (15:02 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_input.c
isl_test.c

index f174143..a7eb860 100644 (file)
@@ -705,18 +705,25 @@ static __isl_give isl_basic_map *read_tuple(struct isl_stream *s,
        isl_token_free(tok);
        if (type != isl_dim_param && next_is_tuple(s)) {
                isl_dim *dim = isl_basic_map_get_dim(bmap);
+               int nparam = isl_dim_size(dim, isl_dim_param);
+               int n_in = isl_dim_size(dim, isl_dim_in);
                isl_basic_map *nested;
-               dim = isl_dim_drop(dim, isl_dim_in, 0,
-                                       isl_dim_size(dim, isl_dim_in));
-               dim = isl_dim_drop(dim, isl_dim_out, 0,
-                                       isl_dim_size(dim, isl_dim_out));
+               if (type == isl_dim_out)
+                       dim = isl_dim_move(dim, isl_dim_param, nparam,
+                                               isl_dim_in, 0, n_in);
                nested = isl_basic_map_alloc_dim(dim, 0, 0, 0);
                nested = read_nested_tuple(s, nested, v);
                if (type == isl_dim_in) {
-                       isl_basic_map_free(bmap);
-                       bmap = isl_basic_map_reverse(nested);
+                       nested = isl_basic_map_reverse(nested);
+                       bmap = isl_basic_map_intersect(nested, bmap);
                } else {
-                       bmap = isl_basic_map_apply_range(bmap, nested);
+                       isl_basic_set *bset;
+                       dim = isl_dim_range(isl_basic_map_get_dim(nested));
+                       dim = isl_dim_drop(dim, isl_dim_param, nparam, n_in);
+                       dim = isl_dim_join(isl_basic_map_get_dim(bmap), dim);
+                       bset = isl_basic_map_domain(bmap);
+                       nested = isl_basic_map_reset_dim(nested, dim);
+                       bmap = isl_basic_map_intersect_domain(nested, bset);
                }
        } else
                bmap = read_var_list(s, bmap, type, v);
index 4aa9fa7..b73b642 100644 (file)
 
 static char *srcdir;
 
+void test_parse_map(isl_ctx *ctx, const char *str)
+{
+       isl_map *map;
+
+       map = isl_map_read_from_str(ctx, str, -1);
+       assert(map);
+       isl_map_free(map);
+}
+
 void test_parse(struct isl_ctx *ctx)
 {
        isl_map *map;
@@ -32,6 +41,8 @@ void test_parse(struct isl_ctx *ctx)
        map = isl_map_read_from_str(ctx, str, -1);
        assert(map);
        isl_map_free(map);
+
+       test_parse_map(ctx, "{[[s] -> A[i]] -> [[s+1] -> A[i]]}");
 }
 
 void test_read(struct isl_ctx *ctx)