+2017-10-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/82563
+ * graphite-isl-ast-to-gimple.c (generate_entry_out_of_ssa_copies):
+ New function.
+ (graphite_regenerate_ast_isl): Call it.
+ * graphite-scop-detection.c (build_scops): Remove entry edge split.
+
2017-10-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/82549
}
}
+/* Generate out-of-SSA copies for the entry edge FALSE_ENTRY/TRUE_ENTRY
+ in REGION. */
+
+static void
+generate_entry_out_of_ssa_copies (edge false_entry,
+ edge true_entry,
+ sese_info_p region)
+{
+ gimple_stmt_iterator gsi_tgt = gsi_start_bb (true_entry->dest);
+ for (gphi_iterator psi = gsi_start_phis (false_entry->dest);
+ !gsi_end_p (psi); gsi_next (&psi))
+ {
+ gphi *phi = psi.phi ();
+ tree res = gimple_phi_result (phi);
+ if (virtual_operand_p (res))
+ continue;
+ /* When there's no out-of-SSA var registered do not bother
+ to create one. */
+ vec <tree> *renames = region->rename_map->get (res);
+ if (! renames || renames->is_empty ())
+ continue;
+ tree new_phi_def = (*renames)[0];
+ gassign *ass = gimple_build_assign (new_phi_def,
+ PHI_ARG_DEF_FROM_EDGE (phi,
+ false_entry));
+ gsi_insert_after (&gsi_tgt, ass, GSI_NEW_STMT);
+ }
+}
+
/* GIMPLE Loop Generator: generates loops in GIMPLE form for the given SCOP.
Return true if code generation succeeded. */
t.translate_isl_ast (context_loop, root_node, e, ip);
if (! t.codegen_error_p ())
{
+ generate_entry_out_of_ssa_copies (if_region->false_region->region.entry,
+ if_region->true_region->region.entry,
+ region);
sese_insert_phis_for_liveouts (region,
if_region->region->region.exit->src,
if_region->false_region->region.exit,
sese_l *s;
FOR_EACH_VEC_ELT (scops_l, i, s)
{
- /* For our out-of-SSA we need a block on s->entry, similar to how
- we include the LCSSA block in the region. */
- s->entry = single_pred_edge (split_edge (s->entry));
-
scop_p scop = new_scop (s->entry, s->exit);
/* Record all basic blocks and their conditions in REGION. */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -floop-nest-optimize" } */
+
+int tj, cw, xf;
+
+void
+zp (int *ei)
+{
+ for (;;)
+ {
+ int hd = 0;
+
+ if (cw != 0 && xf != 0)
+ {
+ for (hd = 0; hd < 3; ++hd)
+ cw = (tj != 0) ? 0 : *ei;
+ for (;;)
+ ;
+ }
+
+ while (tj != 0)
+ tj = (__UINTPTR_TYPE__)&hd;
+ }
+}