re PR tree-optimization/83668 (wrong code with -O -fno-tree-dominator-opts -fgraphite-identity)

2018-01-09  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/83668
	* graphite.c (canonicalize_loop_closed_ssa): Add edge argument,
	move prologue...
	(canonicalize_loop_form): ... here, renamed from ...
	(canonicalize_loop_closed_ssa_form): ... this and amended to
	swap successor edges for loop exit blocks to make us use
	the RPO order we need for initial schedule generation.

	* gcc.dg/graphite/pr83668.c: New testcase.

From-SVN: r256381
This commit is contained in:
Richard Biener 2018-01-09 13:35:43 +00:00 committed by Richard Biener
parent e96a5786c7
commit 82c066f587
4 changed files with 73 additions and 8 deletions

View File

@ -1,3 +1,13 @@
2018-01-09 Richard Biener <rguenther@suse.de>
PR tree-optimization/83668
* graphite.c (canonicalize_loop_closed_ssa): Add edge argument,
move prologue...
(canonicalize_loop_form): ... here, renamed from ...
(canonicalize_loop_closed_ssa_form): ... this and amended to
swap successor edges for loop exit blocks to make us use
the RPO order we need for initial schedule generation.
2018-01-09 Joseph Myers <joseph@codesourcery.com> 2018-01-09 Joseph Myers <joseph@codesourcery.com>
PR tree-optimization/64811 PR tree-optimization/64811

View File

@ -227,15 +227,11 @@ free_scops (vec<scop_p> scops)
/* Transforms LOOP to the canonical loop closed SSA form. */ /* Transforms LOOP to the canonical loop closed SSA form. */
static void static void
canonicalize_loop_closed_ssa (loop_p loop) canonicalize_loop_closed_ssa (loop_p loop, edge e)
{ {
edge e = single_exit (loop);
basic_block bb; basic_block bb;
gphi_iterator psi; gphi_iterator psi;
if (!e || (e->flags & EDGE_COMPLEX))
return;
bb = e->dest; bb = e->dest;
/* Make the loop-close PHI node BB contain only PHIs and have a /* Make the loop-close PHI node BB contain only PHIs and have a
@ -314,14 +310,34 @@ canonicalize_loop_closed_ssa (loop_p loop)
other statements. other statements.
- there exist only one phi node per definition in the loop. - there exist only one phi node per definition in the loop.
In addition to that we also make sure that loop exit edges are
first in the successor edge vector. This is to make RPO order
as computed by pre_and_rev_post_order_compute be consistent with
what initial schedule generation expects.
*/ */
static void static void
canonicalize_loop_closed_ssa_form (void) canonicalize_loop_form (void)
{ {
loop_p loop; loop_p loop;
FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
canonicalize_loop_closed_ssa (loop); {
edge e = single_exit (loop);
if (!e || (e->flags & EDGE_COMPLEX))
continue;
canonicalize_loop_closed_ssa (loop, e);
/* If the exit is not first in the edge vector make it so. */
if (e != EDGE_SUCC (e->src, 0))
{
unsigned ei;
for (ei = 0; EDGE_SUCC (e->src, ei) != e; ++ei)
;
std::swap (EDGE_SUCC (e->src, ei), EDGE_SUCC (e->src, 0));
}
}
/* We can end up releasing duplicate exit PHIs and also introduce /* We can end up releasing duplicate exit PHIs and also introduce
additional copies so the cached information isn't correct anymore. */ additional copies so the cached information isn't correct anymore. */
@ -360,7 +376,7 @@ graphite_transform_loops (void)
the_isl_ctx = ctx; the_isl_ctx = ctx;
sort_sibling_loops (cfun); sort_sibling_loops (cfun);
canonicalize_loop_closed_ssa_form (); canonicalize_loop_form ();
/* Print the loop structure. */ /* Print the loop structure. */
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))

View File

@ -1,3 +1,8 @@
2018-01-09 Richard Biener <rguenther@suse.de>
PR tree-optimization/83668
* gcc.dg/graphite/pr83668.c: New testcase.
2018-01-09 Joseph Myers <joseph@codesourcery.com> 2018-01-09 Joseph Myers <joseph@codesourcery.com>
PR tree-optimization/64811 PR tree-optimization/64811

View File

@ -0,0 +1,34 @@
/* { dg-do run } */
/* { dg-options "-O -fno-tree-dominator-opts -fgraphite-identity" } */
int a, b, c;
int d[14];
int
main (void)
{
short e;
char f;
for (; b >= 0; b--)
{
e = 0;
for (; e < 2; e++)
{
a = 0;
for (; a < 7; a++)
d[a] = 1;
}
if (c)
{
f = 0;
for (; f >= 0; f--)
;
}
}
if (a != 7)
__builtin_abort ();
return 0;
}