This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Don't merge blocks in gimple at -O0 if that would lose goto_locus (PR debug/44375)
On Tue, Jun 08, 2010 at 09:27:32PM -0400, Hans-Peter Nilsson wrote:
> > 2010-06-02 Jakub Jelinek <jakub@redhat.com>
> >
> > PR debug/44375
> > * tree-cfg.c (gimple_can_merge_blocks_p): For -O0
> > return false if merging the bbs would lead to goto_locus
> > location being lost from the IL.
>
> Doesn't this patch cause different code for -O0 than -O0 -g?
Why do you think so? The code intentionally doesn't depend on
write_symbols or debug_info_level, only on !optimize, and
it skips over DEBUG stmts.
> >
> > --- gcc/tree-cfg.c.jj 2010-06-01 12:27:48.000000000 +0200
> > +++ gcc/tree-cfg.c 2010-06-02 10:47:41.000000000 +0200
> > @@ -1477,6 +1477,23 @@ gimple_can_merge_blocks_p (basic_block a
> > && name_mappings_registered_p ())
> > return false;
> >
> > + /* When not optimizing, don't merge if we'd lose goto_locus. */
> > + if (!optimize
> > + && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
> > + {
> > + location_t goto_locus = single_succ_edge (a)->goto_locus;
> > + gimple_stmt_iterator prev, next;
> > + prev = gsi_last_nondebug_bb (a);
> > + next = gsi_after_labels (b);
> > + if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
> > + gsi_next_nondebug (&next);
> > + if ((gsi_end_p (prev)
> > + || gimple_location (gsi_stmt (prev)) != goto_locus)
> > + && (gsi_end_p (next)
> > + || gimple_location (gsi_stmt (next)) != goto_locus))
> > + return false;
> > + }
> > +
> > return true;
> > }
Jakub