reassoc: Fix -fcompare-debug bug in reassociate_bb [PR94329]

The following testcase FAILs with -fcompare-debug, because reassociate_bb
mishandles the case when the last stmt in a bb has zero uses.  In that case
reassoc_remove_stmt (like gsi_remove) moves the iterator to the next stmt,
i.e. gsi_end_p is true, which means the code sets the iterator back to
gsi_last_bb.  The problem is that the for loop does gsi_prev on that before
handling the next statement, which means the former penultimate stmt, now
last one, is not processed by reassociate_bb.
Now, with -g, if there is at least one debug stmt at the end of the bb,
reassoc_remove_stmt moves the iterator to that following debug stmt and we
just do gsi_prev and continue with the former penultimate non-debug stmt,
now last non-debug stmt.

The following patch fixes that by not doing the gsi_prev in this case; there
are too many continue; cases, so I didn't want to copy over the gsi_prev to
all of them, so this patch uses a bool for that instead.  The second
gsi_end_p check isn't needed anymore, because when we don't do the
undesirable gsi_prev after gsi = gsi_last_bb, the loop !gsi_end_p (gsi)
condition will catch the removal of the very last stmt from a bb.

2020-03-28  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94329
	* tree-ssa-reassoc.c (reassociate_bb): When calling reassoc_remove_stmt
	on the last stmt in a bb, make sure gsi_prev isn't done immediately
	after gsi_last_bb.

	* gfortran.dg/pr94329.f90: New test.
This commit is contained in:
Jakub Jelinek 2020-03-28 10:21:52 +01:00
parent 56407bab53
commit aa9c08ef97
4 changed files with 33 additions and 7 deletions

View File

@ -1,6 +1,15 @@
2020-04-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2020-03-28 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94329
* tree-ssa-reassoc.c (reassociate_bb): When calling reassoc_remove_stmt
on the last stmt in a bb, make sure gsi_prev isn't done immediately
after gsi_last_bb.
2020-04-07 Jakub Jelinek <jakub@redhat.com>
2020-03-25 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94303

View File

@ -1,6 +1,11 @@
2020-04-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2020-03-28 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94329
* gfortran.dg/pr94329.f90: New test.
2020-03-25 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94303

View File

@ -0,0 +1,12 @@
! PR tree-optimization/94329
! { dg-do compile }
! { dg-options "-O1 -fno-tree-loop-optimize -fwrapv -fcompare-debug" }
subroutine pr94329 (s, t)
real :: s, t(:,:)
do i = 1,3
do j = 1,3
s = t(i,j)
end do
end do
end

View File

@ -5872,8 +5872,11 @@ reassociate_bb (basic_block bb)
if (stmt && !gimple_visited_p (stmt))
cfg_cleanup_needed |= maybe_optimize_range_tests (stmt);
for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
bool do_prev = false;
for (gsi = gsi_last_bb (bb);
!gsi_end_p (gsi); do_prev ? gsi_prev (&gsi) : (void) 0)
{
do_prev = true;
stmt = gsi_stmt (gsi);
if (is_gimple_assign (stmt)
@ -5899,15 +5902,12 @@ reassociate_bb (basic_block bb)
release_defs (stmt);
/* We might end up removing the last stmt above which
places the iterator to the end of the sequence.
Reset it to the last stmt in this case which might
be the end of the sequence as well if we removed
the last statement of the sequence. In which case
we need to bail out. */
Reset it to the last stmt in this case and make sure
we don't do gsi_prev in that case. */
if (gsi_end_p (gsi))
{
gsi = gsi_last_bb (bb);
if (gsi_end_p (gsi))
break;
do_prev = false;
}
}
continue;