add isl_aff_floor
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 24 Jun 2011 10:20:24 +0000 (12:20 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 25 Jun 2011 20:22:20 +0000 (22:22 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index d80e920..94a216b 100644 (file)
@@ -2245,6 +2245,7 @@ Operations include
                __isl_take isl_aff *aff2);
        __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
        __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
+       __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
        __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
                isl_int f);
        __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
index 75f7421..c7933ae 100644 (file)
@@ -46,6 +46,7 @@ __isl_give isl_div *isl_aff_get_div(__isl_keep isl_aff *aff, int pos);
 
 __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
 __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
+__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
 
 __isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
        __isl_take isl_aff *aff2);
index 0b18668..672c3d8 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -357,11 +357,11 @@ __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff)
        return aff;
 }
 
-/* Given f, return ceil(f).
+/* Given f, return floor(f).
  * If f is an integer expression, then just return f.
- * Otherwise, create a new div d = [-f] and return the expression -d.
+ * Otherwise, create a new div d = [f] and return the expression d.
  */
-__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
+__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff)
 {
        int size;
        isl_ctx *ctx;
@@ -376,10 +376,9 @@ __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
        if (!aff)
                return NULL;
 
-       isl_seq_neg(aff->v->el + 1, aff->v->el + 1, aff->v->size - 1);
        aff->ls = isl_local_space_add_div(aff->ls, isl_vec_copy(aff->v));
        if (!aff->ls)
-               goto error;
+               return isl_aff_free(aff);
 
        ctx = isl_aff_get_ctx(aff);
        size = aff->v->size;
@@ -387,14 +386,30 @@ __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
        aff->v = isl_vec_alloc(ctx, size + 1);
        aff->v = isl_vec_clr(aff->v);
        if (!aff->v)
-               goto error;
+               return isl_aff_free(aff);
        isl_int_set_si(aff->v->el[0], 1);
-       isl_int_set_si(aff->v->el[size], -1);
+       isl_int_set_si(aff->v->el[size], 1);
+
+       return aff;
+}
+
+/* Given f, return ceil(f).
+ * If f is an integer expression, then just return f.
+ * Otherwise, create a new div d = [-f] and return the expression -d.
+ */
+__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
+{
+       if (!aff)
+               return NULL;
+
+       if (isl_int_is_one(aff->v->el[0]))
+               return aff;
+
+       aff = isl_aff_neg(aff);
+       aff = isl_aff_floor(aff);
+       aff = isl_aff_neg(aff);
 
        return aff;
-error:
-       isl_aff_free(aff);
-       return NULL;
 }
 
 /* Apply the expansion computed by isl_merge_divs.