On Tue, 24 Mar 2020, Jakub Jelinek wrote: > Hi! > > The following testcase FAILs with -fcompare-debug. The problem is that > create_iv behaves differently when inserting after into an empty bb (in that > case sets location to goto_locus), or when inserting before gsi_end_p (i.e. > at the end of bb; in that case it will not set location, otherwise it will > set it to the location of next stmt). > This isn't -fcompare-debug friendly, because if inserting after and the > bb contains only debug stmts, then the location will not be set with -g > and will be with -g0, or when inserting before, the location might either > be set from the following debug stmt rather than some non-debug stmt after > that, or might not be set with -g0 if it is to be inserted at the end of bb, > while with -g would be set to location of debug stmt. > > The following patch should fix that, bootstrapped/regtested on x86_64-linux > and i686-linux, ok for trunk?
OK > 2020-03-24 Jakub Jelinek <ja...@redhat.com> > > PR debug/94285 > * tree-ssa-loop-manip.c (create_iv): If after, set stmt location to > e->goto_locus even if gsi_bb (*incr_pos) contains only debug stmts. > If not after and at *incr_pos is a debug stmt, set stmt location to > location of next non-debug stmt after it if any. > > * gfortran.dg/pr94285.f90: New test. > > --- gcc/tree-ssa-loop-manip.c.jj 2020-01-12 11:54:38.506381831 +0100 > +++ gcc/tree-ssa-loop-manip.c 2020-03-23 23:57:41.395225047 +0100 > @@ -129,7 +129,10 @@ create_iv (tree base, tree step, tree va > immediately after a statement whose location is known. */ > if (after) > { > - if (gsi_end_p (*incr_pos)) > + if (gsi_end_p (*incr_pos) > + || (is_gimple_debug (gsi_stmt (*incr_pos)) > + && gsi_bb (*incr_pos) > + && gsi_end_p (gsi_last_nondebug_bb (gsi_bb (*incr_pos))))) > { > edge e = single_succ_edge (gsi_bb (*incr_pos)); > gimple_set_location (stmt, e->goto_locus); > @@ -138,8 +141,11 @@ create_iv (tree base, tree step, tree va > } > else > { > - if (!gsi_end_p (*incr_pos)) > - gimple_set_location (stmt, gimple_location (gsi_stmt (*incr_pos))); > + gimple_stmt_iterator gsi = *incr_pos; > + if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi))) > + gsi_next_nondebug (&gsi); > + if (!gsi_end_p (gsi)) > + gimple_set_location (stmt, gimple_location (gsi_stmt (gsi))); > gsi_insert_before (incr_pos, stmt, GSI_NEW_STMT); > } > > --- gcc/testsuite/gfortran.dg/pr94285.f90.jj 2020-03-23 18:55:19.677902869 > +0100 > +++ gcc/testsuite/gfortran.dg/pr94285.f90 2020-03-23 18:55:01.300172491 > +0100 > @@ -0,0 +1,5 @@ > +! PR debug/94285 > +! { dg-do compile } > +! { dg-options "-Os -fno-tree-dominator-opts -fno-tree-vrp -fcompare-debug" } > + > +include 'array_constructor_40.f90' > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)