On Tue, 26 Feb 2019, Jakub Jelinek wrote:

> On Sat, Feb 23, 2019 at 10:05:40AM +0100, Jakub Jelinek wrote:
> > And finally, for 1) the patch has a case for a dead .ABNORMAL_DISPATCHER,
> > one that has only incoming edges but no successors.  I didn't want to
> > complicate or slow down the processing too much, so it is actually done
> > only if .ABNORMAL_DISPATCHER has no outgoing edges, rather than if it has
> > some, but all of them are in the end to non-visited basic blocks.
> > This means when we for 5) or 4) above remove all such bbs as dead in one
> > cfg cleanup, we remove .ABNORMAL_DISPATCHER only in the following cfg
> > cleanup.
> 
> Thinking about the above, I think we could handle that cheaply in the same
> cleanup cfg rather than in the next one.  Don't know right now if we can
> have at most one .ABNORMAL_DISPATCHER in a function or more (I vaguely
> remember we disallow inlining in some of the ab cases like setjmp,
> non-local goto etc.), if there can be at most one, we could just make
> the .ABNORMAL_DISPATCHER visited normally, but additionally note it in some
> basic_block pointer, if we can have more than one, we could have auto_vec of
> them, and then after the loop just go through that one or more
> .ABNORMAL_DISPATCHER bbs and if they don't have any successors visited,
> unset the visited bit for them as well.

I think we can have multiple .ABNORMAL_DISPATCHERs - at least in theory
via inlining, though I see code in the inliner avoiding multiple ones
at least for nonlocal goto, not sure if that covers all cases.

> Shall I modify the patch for that?

Might it even simplify the patch?  If not the only comment on the
original patch is that it would be nice to test it on a SJLJ EH
target ...

Richard.

> > 2019-02-23  Jakub Jelinek  <ja...@redhat.com>
> > 
> >     PR tree-optimization/89280
> >     * tree-cfgcleanup.c (maybe_dead_abnormal_edge_p,
> >     builtin_setjmp_setup_bb): New functions.
> >     (cleanup_control_flow_pre): Ignore maybe_dead_abnormal_edge_p edges.
> >     When visiting __builtin_setjmp_setup block, queue in special
> >     setjmp_vec vector edges from .ABNORMAL_DISPATCHER to corresponding
> >     __builtin_setjmp_receiver.
> > 
> >     * gcc.c-torture/compile/pr89280.c: New test.
> >     * gcc.dg/torture/pr57147-2.c: Don't expect a setjmp after noreturn
> >     function.  Skip the test for -O0.
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to