add isl_aff_project_domain_on_params
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 3 Jan 2012 09:35:43 +0000 (10:35 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 3 Jan 2012 11:01:17 +0000 (12:01 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index b5460b9..d80faf2 100644 (file)
@@ -2940,6 +2940,9 @@ Operations include
                __isl_take isl_pw_aff *pwaff,
                __isl_take isl_space *model);
 
+       __isl_give isl_aff *isl_aff_project_domain_on_params(
+               __isl_take isl_aff *aff);
+
        __isl_give isl_aff *isl_aff_gist_params(
                __isl_take isl_aff *aff,
                __isl_take isl_set *context);
index a969a0a..30b0163 100644 (file)
@@ -83,6 +83,7 @@ __isl_give isl_aff *isl_aff_add_dims(__isl_take isl_aff *aff,
        enum isl_dim_type type, unsigned n);
 __isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
        enum isl_dim_type type, unsigned first, unsigned n);
+__isl_give isl_aff *isl_aff_project_domain_on_params(__isl_take isl_aff *aff);
 
 __isl_give isl_aff *isl_aff_align_params(__isl_take isl_aff *aff,
        __isl_take isl_space *model);
index fd8d8ca..c99a15d 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -1173,6 +1173,30 @@ __isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
        return aff;
 }
 
+/* Project the domain of the affine expression onto its parameter space.
+ * The affine expression may not involve any of the domain dimensions.
+ */
+__isl_give isl_aff *isl_aff_project_domain_on_params(__isl_take isl_aff *aff)
+{
+       isl_space *space;
+       unsigned n;
+       int involves;
+
+       n = isl_aff_dim(aff, isl_dim_in);
+       involves = isl_aff_involves_dims(aff, isl_dim_in, 0, n);
+       if (involves < 0)
+               return isl_aff_free(aff);
+       if (involves)
+               isl_die(isl_aff_get_ctx(aff), isl_error_invalid,
+                   "affine expression involves some of the domain dimensions",
+                   return isl_aff_free(aff));
+       aff = isl_aff_drop_dims(aff, isl_dim_in, 0, n);
+       space = isl_aff_get_domain_space(aff);
+       space = isl_space_params(space);
+       aff = isl_aff_reset_domain_space(aff, space);
+       return aff;
+}
+
 __isl_give isl_aff *isl_aff_insert_dims(__isl_take isl_aff *aff,
        enum isl_dim_type type, unsigned first, unsigned n)
 {