unsigned total;
isl_int s;
+ if (!bmap || !vec)
+ return -1;
+
total = 1 + isl_basic_map_total_dim(bmap);
if (total != vec->size)
return -1;
return NULL;
}
+/* Given a map A -> f(A) and an integer d, construct a map
+ * A -> floor(f(A)/d).
+ */
+__isl_give isl_map *isl_map_floordiv_val(__isl_take isl_map *map,
+ __isl_take isl_val *d)
+{
+ if (!map || !d)
+ goto error;
+ if (!isl_val_is_int(d))
+ isl_die(isl_val_get_ctx(d), isl_error_invalid,
+ "expecting integer denominator", goto error);
+ map = isl_map_floordiv(map, d->n);
+ isl_val_free(d);
+ return map;
+error:
+ isl_map_free(map);
+ isl_val_free(d);
+ return NULL;
+}
+
static struct isl_basic_map *var_equal(struct isl_basic_map *bmap, unsigned pos)
{
int i;
src = isl_basic_map_order_divs(src);
dst = isl_basic_map_cow(dst);
+ if (!dst)
+ return NULL;
dst = isl_basic_map_extend_space(dst, isl_space_copy(dst->dim),
src->n_div, 0, 2 * src->n_div);
if (!dst)
for (i = 1; i < map->n; ++i)
map->p[0] = isl_basic_map_align_divs(map->p[0], map->p[i]);
- for (i = 1; i < map->n; ++i)
+ for (i = 1; i < map->n; ++i) {
map->p[i] = isl_basic_map_align_divs(map->p[i], map->p[0]);
+ if (!map->p[i])
+ return isl_map_free(map);
+ }
ISL_F_CLR(map, ISL_MAP_NORMALIZED);
return map;
isl_basic_map_offset(bmap, type) - 1 + pos, val);
}
+/* If "bmap" obviously lies on a hyperplane where the given dimension
+ * has a fixed value, then return that value.
+ * Otherwise return NaN.
+ */
+__isl_give isl_val *isl_basic_map_plain_get_val_if_fixed(
+ __isl_keep isl_basic_map *bmap,
+ enum isl_dim_type type, unsigned pos)
+{
+ isl_ctx *ctx;
+ isl_val *v;
+ int fixed;
+
+ if (!bmap)
+ return NULL;
+ ctx = isl_basic_map_get_ctx(bmap);
+ v = isl_val_alloc(ctx);
+ if (!v)
+ return NULL;
+ fixed = isl_basic_map_plain_is_fixed(bmap, type, pos, &v->n);
+ if (fixed < 0)
+ return isl_val_free(v);
+ if (fixed) {
+ isl_int_set_si(v->d, 1);
+ return v;
+ }
+ isl_val_free(v);
+ return isl_val_nan(ctx);
+}
+
int isl_map_plain_is_fixed(__isl_keep isl_map *map,
enum isl_dim_type type, unsigned pos, isl_int *val)
{
return isl_val_nan(ctx);
}
+/* If "set" obviously lies on a hyperplane where the given dimension
+ * has a fixed value, then return that value.
+ * Otherwise return NaN.
+ */
+__isl_give isl_val *isl_set_plain_get_val_if_fixed(__isl_keep isl_set *set,
+ enum isl_dim_type type, unsigned pos)
+{
+ return isl_map_plain_get_val_if_fixed(set, type, pos);
+}
+
int isl_set_plain_is_fixed(__isl_keep isl_set *set,
enum isl_dim_type type, unsigned pos, isl_int *val)
{