add isl_ast_expr_substitute_ids
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 3 Jul 2013 11:21:45 +0000 (3 13:21 +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
include/isl/id_to_ast_expr.h
isl_ast.c
isl_id_to_ast_expr.c

index fe9ad51..a4d55eb 100644 (file)
@@ -6112,6 +6112,13 @@ the context of an C<isl_ast_build>.
        __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_substitute_ids(
+               __isl_take isl_ast_expr *expr,
+               __isl_take isl_id_to_ast_expr *id2expr);
+
+The function C<isl_ast_expr_substitute_ids> replaces the
+subexpressions of C<expr> of type C<isl_ast_expr_id>
+by the corresponding expression in C<id2expr>, if there is any.
 
        #include <isl/ast_build.h>
        __isl_give isl_ast_expr *isl_ast_build_expr_from_pw_aff(
index bebb2eb..2a40582 100644 (file)
@@ -4,6 +4,7 @@
 #include <isl/ctx.h>
 #include <isl/ast_type.h>
 #include <isl/id.h>
+#include <isl/id_to_ast_expr.h>
 #include <isl/val.h>
 #include <isl/list.h>
 #include <isl/printer.h>
@@ -49,6 +50,9 @@ __isl_give isl_ast_expr *isl_ast_expr_get_op_arg(__isl_keep isl_ast_expr *expr,
 int isl_ast_expr_is_equal(__isl_keep isl_ast_expr *expr1,
        __isl_keep isl_ast_expr *expr2);
 
+__isl_give isl_ast_expr *isl_ast_expr_substitute_ids(
+       __isl_take isl_ast_expr *expr, __isl_take isl_id_to_ast_expr *id2expr);
+
 __isl_give isl_printer *isl_printer_print_ast_expr(__isl_take isl_printer *p,
        __isl_keep isl_ast_expr *expr);
 void isl_ast_expr_dump(__isl_keep isl_ast_expr *expr);
index 0ced87a..958360c 100644 (file)
@@ -2,7 +2,7 @@
 #define ISL_ID_TO_AST_EXPR_H
 
 #include <isl/id.h>
-#include <isl/ast.h>
+#include <isl/ast_type.h>
 
 #define ISL_KEY_BASE   id
 #define ISL_VAL_BASE   ast_expr
index 93eff2c..63fc243 100644 (file)
--- a/isl_ast.c
+++ b/isl_ast.c
@@ -591,6 +591,63 @@ error:
        return NULL;
 }
 
+/* For each subexpression of "expr" of type isl_ast_expr_id,
+ * if it appears in "id2expr", then replace it by the corresponding
+ * expression.
+ */
+__isl_give isl_ast_expr *isl_ast_expr_substitute_ids(
+       __isl_take isl_ast_expr *expr, __isl_take isl_id_to_ast_expr *id2expr)
+{
+       int i;
+       isl_id *id;
+
+       if (!expr || !id2expr)
+               goto error;
+
+       switch (expr->type) {
+       case isl_ast_expr_int:
+               break;
+       case isl_ast_expr_id:
+               if (!isl_id_to_ast_expr_has(id2expr, expr->u.id))
+                       break;
+               id = isl_id_copy(expr->u.id);
+               isl_ast_expr_free(expr);
+               expr = isl_id_to_ast_expr_get(id2expr, id);
+               break;
+       case isl_ast_expr_op:
+               for (i = 0; i < expr->u.op.n_arg; ++i) {
+                       isl_ast_expr *arg;
+                       arg = isl_ast_expr_copy(expr->u.op.args[i]);
+                       arg = isl_ast_expr_substitute_ids(arg,
+                                           isl_id_to_ast_expr_copy(id2expr));
+                       if (arg == expr->u.op.args[i]) {
+                               isl_ast_expr_free(arg);
+                               continue;
+                       }
+                       if (!arg)
+                               expr = isl_ast_expr_free(expr);
+                       expr = isl_ast_expr_cow(expr);
+                       if (!expr) {
+                               isl_ast_expr_free(arg);
+                               break;
+                       }
+                       isl_ast_expr_free(expr->u.op.args[i]);
+                       expr->u.op.args[i] = arg;
+               }
+               break;
+       case isl_ast_expr_error:
+               expr = isl_ast_expr_free(expr);
+               break;
+       }
+
+       isl_id_to_ast_expr_free(id2expr);
+       return expr;
+error:
+       isl_ast_expr_free(expr);
+       isl_id_to_ast_expr_free(id2expr);
+       return NULL;
+}
+
 isl_ctx *isl_ast_node_get_ctx(__isl_keep isl_ast_node *node)
 {
        return node ? node->ctx : NULL;
index a0f6080..f8ac7f7 100644 (file)
@@ -1,4 +1,5 @@
 #include <isl/id_to_ast_expr.h>
+#include <isl/ast.h>
 
 #define isl_id_is_equal(id1,id2)       id1 == id2