Commit 679becf1 by Jakub Jelinek

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.
parent c2781192
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-03-27 Alan Modra <amodra@gmail.com> 2020-03-27 Alan Modra <amodra@gmail.com>
PR target/94145 PR target/94145
......
2020-03-28 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94329
* gfortran.dg/pr94329.f90: New test.
2020-03-27 Jakub Jelinek <jakub@redhat.com> 2020-03-27 Jakub Jelinek <jakub@redhat.com>
PR c++/94339 PR c++/94339
......
! 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
...@@ -6224,8 +6224,11 @@ reassociate_bb (basic_block bb) ...@@ -6224,8 +6224,11 @@ reassociate_bb (basic_block bb)
if (stmt && !gimple_visited_p (stmt)) if (stmt && !gimple_visited_p (stmt))
cfg_cleanup_needed |= maybe_optimize_range_tests (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); stmt = gsi_stmt (gsi);
if (is_gimple_assign (stmt) if (is_gimple_assign (stmt)
...@@ -6246,15 +6249,12 @@ reassociate_bb (basic_block bb) ...@@ -6246,15 +6249,12 @@ reassociate_bb (basic_block bb)
release_defs (stmt); release_defs (stmt);
/* We might end up removing the last stmt above which /* We might end up removing the last stmt above which
places the iterator to the end of the sequence. places the iterator to the end of the sequence.
Reset it to the last stmt in this case which might Reset it to the last stmt in this case and make sure
be the end of the sequence as well if we removed we don't do gsi_prev in that case. */
the last statement of the sequence. In which case
we need to bail out. */
if (gsi_end_p (gsi)) if (gsi_end_p (gsi))
{ {
gsi = gsi_last_bb (bb); gsi = gsi_last_bb (bb);
if (gsi_end_p (gsi)) do_prev = false;
break;
} }
} }
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment