static __isl_give isl_basic_map *read_var_def(struct isl_stream *s,
__isl_take isl_basic_map *bmap, enum isl_dim_type type, struct vars *v)
{
+ isl_dim *dim;
+ isl_basic_map *def = NULL;
struct isl_vec *vec;
int k;
int n;
if (!vec)
goto error;
- bmap = add_divs(bmap, v);
- bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
- k = isl_basic_map_alloc_equality(bmap);
+ dim = isl_basic_map_get_dim(bmap);
+ def = isl_basic_map_universe(dim);
+ def = add_divs(def, v);
+ def = isl_basic_map_extend_constraints(def, 1, 0);
+ k = isl_basic_map_alloc_equality(def);
if (k >= 0) {
- isl_seq_cpy(bmap->eq[k], vec->el, vec->size);
- isl_int_set_si(bmap->eq[k][1 + n - 1], -1);
+ isl_seq_cpy(def->eq[k], vec->el, vec->size);
+ isl_int_set_si(def->eq[k][1 + n - 1], -1);
}
isl_vec_free(vec);
if (k < 0)
vars_drop(v, v->n - n);
+ def = isl_basic_map_simplify(def);
+ def = isl_basic_map_finalize(def);
+ bmap = isl_basic_map_intersect(bmap, def);
return bmap;
error:
isl_basic_map_free(bmap);
+ isl_basic_map_free(def);
return NULL;
}
if (tok)
isl_stream_push_token(s, tok);
- bmap = isl_basic_map_simplify(bmap);
- bmap = isl_basic_map_finalize(bmap);
return bmap;
error:
isl_token_free(tok);
void test_parse(struct isl_ctx *ctx)
{
- isl_map *map;
+ isl_map *map, *map2;
const char *str;
str = "{ [i] -> [-i] }";
isl_map_free(map);
test_parse_map(ctx, "{[[s] -> A[i]] -> [[s+1] -> A[i]]}");
+
+ str = "{[new,old] -> [new+1-2*[(new+1)/2],old+1-2*[(old+1)/2]]}";
+ map = isl_map_read_from_str(ctx, str, -1);
+ str = "{ [new, old] -> [o0, o1] : "
+ "exists (e0 = [(-1 - new + o0)/2], e1 = [(-1 - old + o1)/2]: "
+ "2e0 = -1 - new + o0 and 2e1 = -1 - old + o1 and o0 >= 0 and "
+ "o0 <= 1 and o1 >= 0 and o1 <= 1) }";
+ map2 = isl_map_read_from_str(ctx, str, -1);
+ assert(isl_map_is_equal(map, map2));
+ isl_map_free(map);
+ isl_map_free(map2);
}
void test_read(struct isl_ctx *ctx)