https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121762

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> >BUILT_IN_UNREACHABLE -> forwprop with late set
> 
> I am not even positive this is needed any more can be just removed.  
> So basically both VRP and DOM do something about this.
> 
> DOM does it via dom_opt_dom_walker::set_global_ranges_from_unreachable_edges
> .
> And then VRP cleans up the edge.
> 
> VRP does it via m_unreachable.maybe_register .
> 
> Let me think about this and try to remove it.


Here is a testcase improved by optimize_unreachable still, `-O2 -fno-tree-vrp`:
```
int foo(int a, int b, int c, int d)
{
    if (b == a)
        __builtin_unreachable();
    if (c == d)
        __builtin_unreachable();

    return a > 0;
}
```

-O1 works because unreachable bb is not tail merged together so rtl cfgcleanup
removes the conditional.

Note also the check for FORCED_LABEL is not needed in optimize_unreachable
because it does NOT remove the block directly; cfgcleanup does later on if it
can (with a forced label it will be moved [when removing the bb; I fixed that
issue long long time ago] or the pred will be still there and the BB will NOT
be removed). So at least I can do that cleanup first.

Reply via email to