On Fri, Aug 21, 2015 at 03:37:38PM +0200, Richard Biener wrote:
> On Fri, Aug 21, 2015 at 2:49 PM, Marek Polacek <pola...@redhat.com> wrote:
> > On Fri, Aug 21, 2015 at 01:27:43PM +0200, Richard Biener wrote:
> >> On Fri, Aug 21, 2015 at 12:52 PM, Marek Polacek <pola...@redhat.com> wrote:
> >> > This fixes the libgo breakage.  Seems I really should have removed the
> >> > edge after we split the block with null dereference after __builtin_trap
> >> > statement so that it's unreachable.
> >> >
> >> > Bootstrapped/regtested on x86_64-linux + ppc64-linux + bootstrapped on
> >> > aarch64-linux, ok for trunk?
> >>
> >> Hum.  I don't see why this is needed - CFG cleanup (which of course needs
> >> to run!) should do this for you.  In fact stray unreachable blocks are 
> >> usually
> >> more of a problem.
> >
> > Aha.  It seems cleanup does that if I change the code to generate
> > __builtin_unreachable instead of __builtin_trap.  A hint maybe? ;)
> 
> Not really...
> 
> static bool
> cleanup_control_flow_bb (basic_block bb)
> {
> ...
>   /* Check for indirect calls that have been turned into
>      noreturn calls.  */
>   else if (is_gimple_call (stmt)
>            && gimple_call_noreturn_p (stmt)
>            && remove_fallthru_edge (bb->succs))
>     retval = true;
> 
> and __builtin_trap is NORETURN.  But there is the hint where to debug.

Yes, but gimple_call_noreturn_p is false on __builtin_trap.  That's quite
confusing... but flags_from_decl_or_type really returns 0 for __builtin_trap.

So can't we use __builtin_unreachable in isolate-path code?

        Marek

Reply via email to