temporarily make isl_val_int_from_isl_int available
[platform/upstream/isl.git] / isl_map.c
index 5f55931..164e075 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -3852,6 +3852,26 @@ error:
        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;
@@ -8443,6 +8463,35 @@ int isl_basic_map_plain_is_fixed(__isl_keep isl_basic_map *bmap,
                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)
 {
@@ -8480,6 +8529,16 @@ __isl_give isl_val *isl_map_plain_get_val_if_fixed(__isl_keep isl_map *map,
        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)
 {