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?
> 
> 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.

> --- 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

Reply via email to