From c7434b7377cc13a9db71288b44d6f6ddc24351a4 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 23 Jan 2015 23:25:04 +0100 Subject: [PATCH] add pet_tree_map_call_expr This allows users to modify all calls in a pet_tree. Signed-off-by: Sven Verdoolaege --- include/pet.h | 4 ++++ tree.c | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/include/pet.h b/include/pet.h index ff6c737..1d88a55 100644 --- a/include/pet.h +++ b/include/pet.h @@ -339,6 +339,10 @@ int pet_tree_foreach_expr(__isl_keep pet_tree *tree, /* Call "fn" on each access subexpression in the nodes of "tree" */ int pet_tree_foreach_access_expr(__isl_keep pet_tree *tree, int (*fn)(__isl_keep pet_expr *expr, void *user), void *user); +/* Modify all call subexpressions in the nodes of "tree" through "fn". */ +__isl_give pet_tree *pet_tree_map_call_expr(__isl_take pet_tree *tree, + __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, void *user), + void *user); void pet_tree_dump(__isl_keep pet_tree *tree); diff --git a/tree.c b/tree.c index 45d22e4..2d8eca6 100644 --- a/tree.c +++ b/tree.c @@ -1111,29 +1111,33 @@ __isl_give pet_tree *pet_tree_map_expr(__isl_take pet_tree *tree, return tree; } -/* Intermediate data structure for map_access_expr. +/* Intermediate data structure for map_expr. * - * "fn" is the function that needs to be called on each access subexpression. + * "map" is a function that modifies subexpressions of a given type. + * "fn" is the function that needs to be called on each of those subexpressions. * "user" is the user argument to be passed to "fn". */ -struct pet_tree_map_access_expr_data { +struct pet_tree_map_expr_data { + __isl_give pet_expr *(*map)(__isl_take pet_expr *expr, + __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, + void *user), void *user); __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, void *user); void *user; }; /* This function is called on each top-level expressions in the nodes - * of a tree. Modify all access subexpressions of the top-level + * of a tree. Call data->map to modify subexpressions of the top-level * expression by calling data->fn on them. * - * This is a wrapper around pet_expr_map_access for use as a callback + * This is a wrapper around data->map for use as a callback * to pet_tree_map_expr. */ -static __isl_give pet_expr *map_access_expr(__isl_take pet_expr *expr, +static __isl_give pet_expr *map_expr(__isl_take pet_expr *expr, void *user) { - struct pet_tree_map_access_expr_data *data = user; + struct pet_tree_map_expr_data *data = user; - return pet_expr_map_access(expr, data->fn, data->user); + return data->map(expr, data->fn, data->user); } /* Modify all access subexpressions in the nodes of "tree" @@ -1146,9 +1150,24 @@ __isl_give pet_tree *pet_tree_map_access_expr(__isl_take pet_tree *tree, __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, void *user), void *user) { - struct pet_tree_map_access_expr_data data = { fn, user }; + struct pet_tree_map_expr_data data = { &pet_expr_map_access, fn, user }; + + return pet_tree_map_expr(tree, &map_expr, &data); +} + +/* Modify all call subexpressions in the nodes of "tree" + * by calling "fn" on them. + * + * We run over all expressions in the nodes of "tree" and call "fn" + * on each call subexpression of those expressions. + */ +__isl_give pet_tree *pet_tree_map_call_expr(__isl_take pet_tree *tree, + __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, void *user), + void *user) +{ + struct pet_tree_map_expr_data data = { &pet_expr_map_call, fn, user }; - return pet_tree_map_expr(tree, &map_access_expr, &data); + return pet_tree_map_expr(tree, &map_expr, &data); } /* Wrapper around pet_expr_align_params -- 2.11.4.GIT