+2010-01-14 Sebastian Pop <sebastian.pop@amd.com>
+
+ PR middle-end/42732
+ * graphite-clast-to-gimple.c (gloog): Call scev_reset_htab and
+ rename_nb_iterations.
+ * sese.c (rename_variables_in_operand): New.
+ (rename_variables_in_expr): New.
+ (rename_nb_iterations): New.
+ (sese_adjust_liveout_phis): Update the rename_map.
+ * sese.h (rename_nb_iterations): Declared.
+ * tree-scalar-evolution.c (scev_reset_htab): New.
+ (scev_reset): Call scev_reset_htab.
+ * tree-scalar-evolution.h (scev_reset_htab): Declared.
+
+ * testsuite/gfortran.dg/graphite/pr42732.f: New.
+
2010-01-08 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/42393
print_generated_program (stderr, scop);
}
-/* Add CLooG names to parameter index. The index is used to translate back from
- * CLooG names to GCC trees. */
+/* Add CLooG names to parameter index. The index is used to translate
+ back from CLooG names to GCC trees. */
static void
create_params_index (htab_t index_table, CloogProgram *prog) {
if_region->region->exit->src,
if_region->false_region->exit,
if_region->true_region->exit);
+ scev_reset_htab ();
+ rename_nb_iterations (rename_map);
recompute_all_dominators ();
graphite_verify ();
}
}
-/* Returns the name associated to OLD_NAME in MAP. */
+/* Returns the expression associated to OLD_NAME in MAP. */
static tree
get_rename (htab_t map, tree old_name)
return old_name;
}
-/* Register in MAP the rename tuple (old_name, expr). */
+/* Register in MAP the rename tuple (OLD_NAME, EXPR). */
void
set_rename (htab_t map, tree old_name, tree expr)
*slot = new_rename_map_elt (old_name, expr);
}
+static void rename_variables_in_expr (htab_t, tree);
+
+/* Renames the operand OP of expression T following the tuples
+ (OLD_NAME, EXPR) in RENAME_MAP. */
+
+static void
+rename_variables_in_operand (htab_t rename_map, tree t, int op)
+{
+ tree operand = TREE_OPERAND (t, op);
+
+ if (TREE_CODE (operand) == SSA_NAME)
+ {
+ tree new_name = get_rename (rename_map, operand);
+
+ if (new_name != operand)
+ TREE_OPERAND (t, op) = new_name;
+ }
+ else
+ rename_variables_in_expr (rename_map, operand);
+}
+
+/* Renames the expression T following the tuples (OLD_NAME, EXPR) in
+ RENAME_MAP. */
+
+static void
+rename_variables_in_expr (htab_t rename_map, tree t)
+{
+ if (!t)
+ return;
+
+ switch (TREE_CODE_LENGTH (TREE_CODE (t)))
+ {
+ case 3:
+ rename_variables_in_operand (rename_map, t, 2);
+
+ case 2:
+ rename_variables_in_operand (rename_map, t, 1);
+
+ case 1:
+ rename_variables_in_operand (rename_map, t, 0);
+
+ default:
+ return;
+ }
+}
+
+/* Renames all the loop->nb_iterations expressions following the
+ tuples (OLD_NAME, EXPR) in RENAME_MAP. */
+
+void
+rename_nb_iterations (htab_t rename_map)
+{
+ loop_iterator li;
+ struct loop *loop;
+
+ FOR_EACH_LOOP (li, loop, 0)
+ {
+ rename_variables_in_expr (rename_map, loop->nb_iterations);
+ }
+}
+
/* Adjusts the phi nodes in the block BB for variables defined in
SCOP_REGION and used outside the SCOP_REGION. The code generation
moves SCOP_REGION in the else clause of an "if (1)" and generates
unsigned i;
unsigned false_i = 0;
gimple phi = gsi_stmt (si);
+ tree res = gimple_phi_result (phi);
- if (!is_gimple_reg (PHI_RESULT (phi)))
+ if (!is_gimple_reg (res))
{
sese_adjust_vphi (region, phi, true_e);
continue;
}
SET_PHI_ARG_DEF (phi, i, expr);
+ set_rename (rename_map, old_name, res);
}
}
}
}
}
-/* Cleans up the information cached by the scalar evolutions analysis. */
+/* Cleans up the information cached by the scalar evolutions analysis
+ in the hash table. */
+
+void
+scev_reset_htab (void)
+{
+ if (!scalar_evolution_info)
+ return;
+
+ htab_empty (scalar_evolution_info);
+}
+
+/* Cleans up the information cached by the scalar evolutions analysis
+ in the hash table and in the loop->nb_iterations. */
void
scev_reset (void)
loop_iterator li;
struct loop *loop;
- if (!scalar_evolution_info || !current_loops)
+ scev_reset_htab ();
+
+ if (!current_loops)
return;
- htab_empty (scalar_evolution_info);
FOR_EACH_LOOP (li, loop, 0)
{
loop->nb_iterations = NULL_TREE;