Remove unused arguments of bulitin_unreachable

Richard Biener richard.guenther@gmail.com
Fri Dec 12 09:19:00 GMT 2014


On Thu, Dec 11, 2014 at 7:16 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> On Thu, Dec 11, 2014 at 06:06:55PM +0100, Jan Hubicka wrote:
>> > Hi,
>> > in firefox .optimized dumps one can see few places where __builtin_unreachable
>> > is called (as a result of devirtualization code proving the code path to be
>> > undefined).  There is usually some argument setup for the parameters of
>> > __builtin_unreachable that are dead.  This patch makes it somewhat better
>> > so now we get:
>> >   <bb 30>:
>> >   # prephitmp_222 = PHI <_52(27), pretmp_245(29)>
>> >   _57 = prephitmp_222 + 2;
>> >   pool_40(D)->ptr = _57;
>> >   __builtin_unreachable ();
>> >
>> > Why DSE does not eliminate the stores prior noreturn const function?

Probably because it has a very special special-casing of "function exit" and
because pool_40(D)->ptr is a global store which cannot be eliminated
(it doesn't special case noreturn const function "exits").

>> > Bootstrapped/regtested x86_64-linux, OK?
>> >
>> > Honza
>> >     * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Remove dead parameters
>> >     of BUILT_IN_UNREACHABLE
>>
>> Shouldn't this be done when you actually change the call to
>> __builtin_unreachable ()?  I mean, __builtin_unreachable () has no
>> arguments, so leaving any arguments there is broken IL, even if you clean it
>> up during the next DCE.
>
> Hmm, I tought there was some reason to not do so becuase of inplace folding and memory-SSA.

Well, reducing the number of used ops is fine for in-place folding.  memory-SSA
shouldn't be an issue.

Richard.

> I can give a try to update all the places we can put builtin_unreachable into IL.
> (I wonder if that also include standard constant propagation)
>
> Honza
>>
>> > --- tree-ssa-dce.c  (revision 218610)
>> > +++ tree-ssa-dce.c  (working copy)
>> > @@ -250,6 +250,15 @@ mark_stmt_if_obviously_necessary (gimple
>> >         case BUILT_IN_ALLOCA:
>> >         case BUILT_IN_ALLOCA_WITH_ALIGN:
>> >           return;
>> > +       case BUILT_IN_UNREACHABLE:
>> > +         /* All parameters of BUILT_IN_UNREACHABLE are dead.  Remove them
>> > +            from the stmt, so we can remove their definitions.  */
>> > +         if (gimple_call_num_args (stmt))
>> > +           {
>> > +             gimple_set_num_ops (stmt, 3);
>> > +             update_stmt (stmt);
>> > +           }
>> > +         break;
>> >
>> >         default:;
>> >         }
>>
>>       Jakub



More information about the Gcc-patches mailing list