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