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:
parent
56407bab53
commit
aa9c08ef97
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue