add isl_ast_expr_access
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 6 Jun 2013 16:09:24 +0000 (6 18:09 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 27 Jul 2013 09:04:01 +0000 (27 11:04 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/ast.h
isl_ast.c

index 2d65a17..fe9ad51 100644 (file)
@@ -6109,6 +6109,9 @@ the context of an C<isl_ast_build>.
        __isl_give isl_ast_expr *isl_ast_expr_or(
                __isl_take isl_ast_expr *expr1,
                __isl_take isl_ast_expr *expr2)
+       __isl_give isl_ast_expr *isl_ast_expr_access(
+               __isl_take isl_ast_expr *array,
+               __isl_take isl_ast_expr_list *indices);
 
        #include <isl/ast_build.h>
        __isl_give isl_ast_expr *isl_ast_build_expr_from_pw_aff(
index 3eadef7..fa5d7b3 100644 (file)
@@ -83,6 +83,8 @@ __isl_give isl_ast_expr *isl_ast_expr_and(__isl_take isl_ast_expr *expr1,
        __isl_take isl_ast_expr *expr2);
 __isl_give isl_ast_expr *isl_ast_expr_or(__isl_take isl_ast_expr *expr1,
        __isl_take isl_ast_expr *expr2);
+__isl_give isl_ast_expr *isl_ast_expr_access(__isl_take isl_ast_expr *array,
+       __isl_take isl_ast_expr_list *indices);
 
 __isl_give isl_ast_expr *isl_ast_expr_copy(__isl_keep isl_ast_expr *expr);
 void *isl_ast_expr_free(__isl_take isl_ast_expr *expr);
index 06565c3..93eff2c 100644 (file)
--- a/isl_ast.c
+++ b/isl_ast.c
@@ -555,6 +555,42 @@ __isl_give isl_ast_expr *isl_ast_expr_or(__isl_take isl_ast_expr *expr1,
        return isl_ast_expr_alloc_binary(isl_ast_op_or, expr1, expr2);
 }
 
+/* Create an expression representing an access to "array" with index
+ * expressions "indices".
+ */
+__isl_give isl_ast_expr *isl_ast_expr_access(__isl_take isl_ast_expr *array,
+       __isl_take isl_ast_expr_list *indices)
+{
+       int i, n;
+       isl_ctx *ctx;
+       isl_ast_expr *access = NULL;
+
+       if (!array || !indices)
+               goto error;
+
+       ctx = isl_ast_expr_get_ctx(array);
+       n = isl_ast_expr_list_n_ast_expr(indices);
+       access = isl_ast_expr_alloc_op(ctx, isl_ast_op_access, 1 + n);
+       if (!access)
+               goto error;
+       for (i = 0; i < n; ++i) {
+               isl_ast_expr *index;
+               index = isl_ast_expr_list_get_ast_expr(indices, i);
+               access->u.op.args[1 + i] = index;
+               if (!index)
+                       goto error;
+       }
+       access->u.op.args[0] = array;
+
+       isl_ast_expr_list_free(indices);
+       return access;
+error:
+       isl_ast_expr_free(array);
+       isl_ast_expr_list_free(indices);
+       isl_ast_expr_free(access);
+       return NULL;
+}
+
 isl_ctx *isl_ast_node_get_ctx(__isl_keep isl_ast_node *node)
 {
        return node ? node->ctx : NULL;