diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/graphite-isl-ast-to-gimple.c | 32 | ||||
-rw-r--r-- | gcc/graphite-scop-detection.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/graphite/pr82563.c | 24 |
5 files changed, 69 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63688ad..4107557 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +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 diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index 2a583ab..959d31d 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -1501,6 +1501,35 @@ copy_internal_parameters (sese_info_p region, sese_info_p to_region) } } +/* 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. */ @@ -1548,6 +1577,9 @@ graphite_regenerate_ast_isl (scop_p scop) 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, diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index c7e1dba..ce6ab95 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1708,10 +1708,6 @@ build_scops (vec<scop_p> *scops) 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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a692d3..bd817f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-10-17 Richard Biener <rguenther@suse.de> + + PR tree-optimization/82563 + * gcc.dg/graphite/pr82563.c: New testcase. + 2017-10-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/67831 diff --git a/gcc/testsuite/gcc.dg/graphite/pr82563.c b/gcc/testsuite/gcc.dg/graphite/pr82563.c new file mode 100644 index 0000000..cd492fa --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr82563.c @@ -0,0 +1,24 @@ +/* { 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; + } +} |