aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-isl-ast-to-gimple.c
diff options
context:
space:
mode:
authorAditya Kumar <aditya.k7@samsung.com>2016-01-21 02:14:01 +0000
committerSebastian Pop <spop@gcc.gnu.org>2016-01-21 02:14:01 +0000
commit1d198f097b982b60d23465356a8f9abc32762d4c (patch)
tree4b62710a3bf44529085f6400662b4ea8e08c31b6 /gcc/graphite-isl-ast-to-gimple.c
parentb920a047635c09df188279c02af1499a77e630f7 (diff)
downloadgcc-1d198f097b982b60d23465356a8f9abc32762d4c.zip
gcc-1d198f097b982b60d23465356a8f9abc32762d4c.tar.gz
gcc-1d198f097b982b60d23465356a8f9abc32762d4c.tar.bz2
fix pr68692: reinstantiate the copy of internal parameters
Adding a testcase and reverting this patch: [PATCH] remove parameter_rename_map This map was used in the transition to the new scop detection: with the new scop detection, we do not need this map anymore. * graphite-isl-ast-to-gimple.c (gcc_expression_from_isl_ast_expr_id): Remove use of parameter_rename_map. (copy_def): Remove. (copy_internal_parameters): Remove. (graphite_regenerate_ast_isl): Remove call to copy_internal_parameters. * sese.c (new_sese_info): Do not initialize parameter_rename_map. (free_sese_info): Do not free parameter_rename_map. (set_rename): Do not use parameter_rename_map. (rename_uses): Update call to set_rename. (graphite_copy_stmts_from_block): Do not use parameter_rename_map. * sese.h (parameter_rename_map_t): Remove. (struct sese_info_t): Remove field parameter_rename_map. Co-Authored-By: Sebastian Pop <s.pop@samsung.com> From-SVN: r232659
Diffstat (limited to 'gcc/graphite-isl-ast-to-gimple.c')
-rw-r--r--gcc/graphite-isl-ast-to-gimple.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 2f2daec..98e347a 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -527,7 +527,11 @@ gcc_expression_from_isl_ast_expr_id (tree type,
"Could not map isl_id to tree expression");
isl_ast_expr_free (expr_id);
tree t = res->second;
- return fold_convert (type, t);
+ 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
@@ -1495,6 +1499,13 @@ translate_isl_ast_to_gimple::set_rename (tree old_name, tree expr)
r.safe_push (expr);
region->rename_map->put (old_name, r);
}
+
+ tree t;
+ int i;
+ /* For a parameter of a scop we don't want to rename it. */
+ FOR_EACH_VEC_ELT (region->params, i, t)
+ if (old_name == t)
+ region->parameter_rename_map->put(old_name, expr);
}
/* Return an iterator to the instructions comes last in the execution order.
@@ -2755,6 +2766,14 @@ should_copy_to_new_region (gimple *stmt, sese_info_p region)
&& scev_analyzable_p (lhs, region->region))
return false;
+ /* Do not copy parameters that have been generated in the header of the
+ scop. */
+ if (is_gimple_assign (stmt)
+ && (lhs = gimple_assign_lhs (stmt))
+ && TREE_CODE (lhs) == SSA_NAME
+ && region->parameter_rename_map->get(lhs))
+ return false;
+
return true;
}
@@ -2820,6 +2839,25 @@ translate_isl_ast_to_gimple::graphite_copy_stmts_from_block (basic_block bb,
if (codegen_error_p ())
return false;
+ /* For each SSA_NAME in the parameter_rename_map rename their usage. */
+ ssa_op_iter iter;
+ use_operand_p use_p;
+ if (!is_gimple_debug (copy))
+ FOR_EACH_SSA_USE_OPERAND (use_p, copy, iter, SSA_OP_USE)
+ {
+ tree old_name = USE_FROM_PTR (use_p);
+
+ if (TREE_CODE (old_name) != SSA_NAME
+ || SSA_NAME_IS_DEFAULT_DEF (old_name))
+ continue;
+
+ tree *new_expr = region->parameter_rename_map->get (old_name);
+ if (!new_expr)
+ continue;
+
+ replace_exp (use_p, *new_expr);
+ }
+
update_stmt (copy);
}
@@ -3270,6 +3308,70 @@ translate_isl_ast_to_gimple::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_info_p region, sese_info_p to_region,
+ gimple_stmt_iterator *gsi)
+{
+ if (!defined_in_sese_p (tr, region->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_info_p region, sese_info_p 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->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.
@@ -3304,6 +3406,9 @@ graphite_regenerate_ast_isl (scop_p scop)
loop_p context_loop = region->region.entry->src->loop_father;
+ /* Copy all the parameters which are defined in the region. */
+ copy_internal_parameters(if_region->false_region, if_region->true_region);
+
edge e = single_succ_edge (if_region->true_region->region.entry->dest);
basic_block bb = split_edge (e);