aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-isl-ast-to-gimple.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/graphite-isl-ast-to-gimple.c')
-rw-r--r--gcc/graphite-isl-ast-to-gimple.c81
1 files changed, 77 insertions, 4 deletions
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 5434bfd..a8c99c3 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -57,7 +57,9 @@ extern "C" {
#include "tree-ssa-loop-manip.h"
#include "tree-scalar-evolution.h"
#include "gimple-ssa.h"
+#include "tree-phinodes.h"
#include "tree-into-ssa.h"
+#include "ssa-iterators.h"
#include <map>
#include "graphite-isl-ast-to-gimple.h"
@@ -286,7 +288,12 @@ gcc_expression_from_isl_ast_expr_id (tree type,
gcc_assert (res != ip.end () &&
"Could not map isl_id to tree expression");
isl_ast_expr_free (expr_id);
- return fold_convert (type, res->second);
+ tree t = res->second;
+ tree *val = region->parameter_rename_map->get(t);
+
+ if (!val)
+ val = &t;
+ return fold_convert (type, *val);
}
/* Converts an isl_ast_expr_int expression E to a GCC expression tree of
@@ -1063,6 +1070,69 @@ scop_to_isl_ast (scop_p scop, ivs_params &ip)
return ast_isl;
}
+/* Copy def from sese REGION to the newly created TO_REGION. TR is defined by
+ DEF_STMT. GSI points to entry basic block of the TO_REGION. */
+
+static void
+copy_def(tree tr, gimple def_stmt, sese region, sese to_region, gimple_stmt_iterator *gsi)
+{
+ if (!defined_in_sese_p (tr, region))
+ return;
+ ssa_op_iter iter;
+ use_operand_p use_p;
+
+ FOR_EACH_SSA_USE_OPERAND (use_p, def_stmt, iter, SSA_OP_USE)
+ {
+ tree use_tr = USE_FROM_PTR (use_p);
+
+ /* Do not copy parameters that have been generated in the header of the
+ scop. */
+ if (region->parameter_rename_map->get(use_tr))
+ continue;
+
+ gimple def_of_use = SSA_NAME_DEF_STMT (use_tr);
+ if (!def_of_use)
+ continue;
+
+ copy_def (use_tr, def_of_use, region, to_region, gsi);
+ }
+
+ gimple copy = gimple_copy (def_stmt);
+ gsi_insert_after (gsi, copy, GSI_NEW_STMT);
+
+ /* Create new names for all the definitions created by COPY and
+ add replacement mappings for each new name. */
+ def_operand_p def_p;
+ ssa_op_iter op_iter;
+ FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
+ {
+ tree old_name = DEF_FROM_PTR (def_p);
+ tree new_name = create_new_def_for (old_name, copy, def_p);
+ region->parameter_rename_map->put(old_name, new_name);
+ }
+
+ update_stmt (copy);
+}
+
+static void
+copy_internal_parameters(sese region, sese to_region)
+{
+ /* For all the parameters which definitino is in the if_region->false_region,
+ insert code on true_region (if_region->true_region->entry). */
+
+ int i;
+ tree tr;
+ gimple_stmt_iterator gsi = gsi_start_bb(to_region->entry->dest);
+
+ FOR_EACH_VEC_ELT (region->params, i, tr)
+ {
+ // If def is not in region.
+ gimple def_stmt = SSA_NAME_DEF_STMT (tr);
+ if (def_stmt)
+ copy_def (tr, def_stmt, region, to_region, &gsi);
+ }
+}
+
/* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
the given SCOP. Return true if code generation succeeded.
@@ -1102,10 +1172,13 @@ graphite_regenerate_ast_isl (scop_p scop)
context_loop = SESE_ENTRY (region)->src->loop_father;
- translate_isl_ast_to_gimple t (region);
+ /* Copy all the parameters which are defined in the region. */
+ copy_internal_parameters(if_region->false_region, if_region->true_region);
- t.translate_isl_ast (context_loop, root_node, if_region->true_region->entry,
- ip);
+ translate_isl_ast_to_gimple t(region);
+ edge e = single_succ_edge (if_region->true_region->entry->dest);
+ split_edge (e);
+ t.translate_isl_ast (context_loop, root_node, e, ip);
mark_virtual_operands_for_renaming (cfun);
update_ssa (TODO_update_ssa);