Fix PR41573, remove pass_remove_useless_stmts
Richard Guenther
richard.guenther@gmail.com
Wed Oct 7 13:24:00 GMT 2009
On Wed, Oct 7, 2009 at 2:29 PM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> remove_useless_stmts folds statements at a time where not the whole
> optimization engine is initialized yet, which causes the segfault of the
> above bugreport. Now, instead of just fixing the symptom I thought maybe
> we can get rid of the whole pass instead. Digging around it seems to have
> been rotting away for some years already, while occasionally making it
> remove less stmts or fixing other bugs, somewhen being split into
> cfg_remove_useless_stmts, which shortly after was removed again. It
> survived tuplification living its meagre life on and on.
>
> To determine its meagreness I added some statistics code to see what it
> actually still removes and measured a whole bootstrap cycle with testsuite
> (all languages+Ada), and this is the result:
>
> number of compiler invocations: 70332
> overall number of repeats: 214136
> (When something is changed by r_u_s it repeats the scan of all insns
> again)
> overall insns visited: 1025945788
> of those changed at all: 1111266 (a whopping promille)
> nr of conditional insns: 4136111
> of those trivial true: 84084
> trivial false: 152987
> same destination: 8 (wow)
> nr unconditional gotos: 244390760
> of those fallthru: 478812
> nr of GIMPLE_BIND: 2268987
> of those removed: 304083
> nr of TRY_FINALLY: 201032
> of those empty eval: 17130
> empty cleanup: 2090
> nonbranching body: 7095
> nr of TRY_CATCH: 178155
> of those empty cleanup: 0
> or non-throwing body: 61094
> nr of stale GIMPLE_NOP: 3883
> nr of other insns: 774766860
>
> So, it removes a few gotos, but that will also be done shortly after this
> pass in optimization (and could be done in the gimplifier already). It
> removes some GIMPLE_BIND, where all of them will go away two passes later
> anyway. It does some cleanup on the exception constructs, but with rths
> rewrite to expand them on trees something equivalent will be done three
> passes later.
>
> So, I removed the whole thing. tramp3d compiles even a bit faster on -O0
> now. Bootstrap times are unaffected.
>
> Doing this without regressions requires some minor surgery, mostly due to
> the pass formerly calling fold on all statements:
> * the builtin folders should use, well fold, not buildX directly, where
> applicable
> * exception lowering should accept empty cleanups and do the obvious thing
> * exception region copying (used by omp lowering) should deal gracefully
> with empty labels (left over when expanding trivial regions sometimes,
> until cleanup_eh)
> * free_lang_data shouldn't null out DECL_INITIAL for static constants
> (and the LTO streamer then needs to accept this)
> * LTO streamer should deal with GIMPLE_NOP (they're left until expand
> with -O0)
>
> Regstrapped on x86_64-linux, no regressions, all languages+Ada. Okay for
> trunk?
Ok with ...
> --- testsuite/gcc.dg/tree-ssa/foldstring-1.c (revision 152447)
> +++ testsuite/gcc.dg/tree-ssa/foldstring-1.c (working copy)
> @@ -1,5 +1,5 @@
> /* { dg-do compile } */
> -/* { dg-options "-O1 -fdump-tree-useless" } */
> +/* { dg-options "-O1 -fdump-tree-fre" } */
>
> void
> arf ()
> @@ -7,5 +7,5 @@ arf ()
> if (""[0] == 0)
> blah ();
> }
> -/* { dg-final { scan-tree-dump-times "= 0;" 1 "useless"} } */
> -/* { dg-final { cleanup-tree-dump "useless" } } */
> +/* { dg-final { scan-tree-dump-times "= 0;" 1 "fre"} } */
> +/* { dg-final { cleanup-tree-dump "fre" } } */
Changing that to scan the gimple dump, XFAILing it and file
a missed-optimization PR for fold / gimplification.
Oh, and please wait some 24h in case somebody has strong
reasons to keep that pass.
Thanks,
Richard.
More information about the Gcc-patches
mailing list