This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Extreme PRE compile times
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: law at redhat dot com
- Cc: gcc at gcc dot gnu dot org
- Date: Thu, 13 Nov 2003 11:19:55 -0500 (EST)
- Subject: Re: Extreme PRE compile times
- References: <200311130442.hAD4gWAA015150@speedy.slc.redhat.com>
On Wed, 12 Nov 2003 law@redhat.com wrote:
>
> Compiling g++.dg/eh/cleanup1.C without PRE we get:
>
> Execution times (seconds)
> garbage collection : 1.56 ( 1%) usr 0.02 ( 2%) sys 1.56 ( 1%) wall
> callgraph construction: 0.12 ( 0%) usr 0.02 ( 2%) sys 0.14 ( 0%) wall
> cfg construction : 0.55 ( 0%) usr 0.00 ( 0%) sys 0.52 ( 0%) wall
> cfg cleanup : 0.64 ( 1%) usr 0.00 ( 0%) sys 0.64 ( 1%) wall
> trivially dead code : 0.30 ( 0%) usr 0.00 ( 0%) sys 0.31 ( 0%) wall
> life analysis : 3.36 ( 3%) usr 0.01 ( 1%) sys 3.36 ( 3%) wall
> life info update : 2.65 ( 2%) usr 0.00 ( 0%) sys 2.62 ( 2%) wall
> alias analysis : 0.53 ( 0%) usr 0.00 ( 0%) sys 0.53 ( 0%) wall
> register scan : 0.20 ( 0%) usr 0.00 ( 0%) sys 0.22 ( 0%) wall
> rebuild jump labels : 0.12 ( 0%) usr 0.00 ( 0%) sys 0.11 ( 0%) wall
> preprocessing : 0.01 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall
> parser : 1.97 ( 2%) usr 0.06 ( 6%) sys 2.00 ( 2%) wall
> name lookup : 0.01 ( 0%) usr 0.02 ( 2%) sys 0.04 ( 0%) wall
> integration : 2.04 ( 2%) usr 0.03 ( 3%) sys 2.08 ( 2%) wall
> tree gimplify : 0.32 ( 0%) usr 0.00 ( 0%) sys 0.33 ( 0%) wall
> tree eh : 0.14 ( 0%) usr 0.01 ( 1%) sys 0.16 ( 0%) wall
> tree CFG construction : 0.61 ( 1%) usr 0.03 ( 3%) sys 0.66 ( 1%) wall
> tree CFG cleanup : 0.66 ( 1%) usr 0.00 ( 0%) sys 0.69 ( 1%) wall
> tree must-alias : 0.02 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 0%) wall
> tree PHI insertion : 12.46 (11%) usr 0.01 ( 1%) sys 12.47 (11%) wall
> tree SSA rewrite : 0.09 ( 0%) usr 0.01 ( 1%) sys 0.11 ( 0%) wall
> tree SSA other : 0.24 ( 0%) usr 0.02 ( 2%) sys 0.26 ( 0%) wall
> tree thread jumps : 0.25 ( 0%) usr 0.03 ( 3%) sys 0.27 ( 0%) wall
> dominator optimization: 0.58 ( 1%) usr 0.03 ( 3%) sys 0.61 ( 1%) wall
> tree CCP : 0.22 ( 0%) usr 0.01 ( 1%) sys 0.22 ( 0%) wall
> tree COPYPROP : 0.03 ( 0%) usr 0.00 ( 0%) sys 0.03 ( 0%) wall
> tree DCE : 0.20 ( 0%) usr 0.01 ( 1%) sys 0.20 ( 0%) wall
> tree SSA to normal : 0.26 ( 0%) usr 0.01 ( 1%) sys 0.28 ( 0%) wall
> dominance frontiers : 0.02 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 0%) wall
> expand : 0.55 ( 0%) usr 0.03 ( 3%) sys 0.53 ( 0%) wall
> jump : 2.81 ( 3%) usr 0.02 ( 2%) sys 2.88 ( 3%) wall
> CSE : 1.15 ( 1%) usr 0.00 ( 0%) sys 1.19 ( 1%) wall
> global CSE : 4.24 ( 4%) usr 0.41 (42%) sys 4.63 ( 4%) wall
> loop analysis : 0.05 ( 0%) usr 0.00 ( 0%) sys 0.03 ( 0%) wall
> bypass jumps : 0.63 ( 1%) usr 0.06 ( 6%) sys 0.69 ( 1%) wall
> CSE 2 : 0.34 ( 0%) usr 0.00 ( 0%) sys 0.35 ( 0%) wall
> branch prediction : 1.72 ( 2%) usr 0.00 ( 0%) sys 1.72 ( 2%) wall
> flow analysis : 0.06 ( 0%) usr 0.00 ( 0%) sys 0.08 ( 0%) wall
> combiner : 9.35 ( 8%) usr 0.00 ( 0%) sys 9.35 ( 8%) wall
> if-conversion : 3.03 ( 3%) usr 0.01 ( 1%) sys 3.03 ( 3%) wall
> regmove : 0.16 ( 0%) usr 0.00 ( 0%) sys 0.17 ( 0%) wall
> mode switching : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall
> local alloc : 0.36 ( 0%) usr 0.01 ( 1%) sys 0.37 ( 0%) wall
> global alloc : 17.18 (15%) usr 0.01 ( 1%) sys 17.18 (15%) wall
> reload CSE regs : 1.95 ( 2%) usr 0.01 ( 1%) sys 1.96 ( 2%) wall
> flow 2 : 0.29 ( 0%) usr 0.00 ( 0%) sys 0.29 ( 0%) wall
> if-conversion 2 : 1.24 ( 1%) usr 0.00 ( 0%) sys 1.23 ( 1%) wall
> peephole 2 : 0.10 ( 0%) usr 0.00 ( 0%) sys 0.11 ( 0%) wall
> rename registers : 3.73 ( 3%) usr 0.04 ( 4%) sys 3.77 ( 3%) wall
> scheduling 2 : 31.25 (28%) usr 0.00 ( 0%) sys 31.27 (28%) wall
> reorder blocks : 0.18 ( 0%) usr 0.00 ( 0%) sys 0.17 ( 0%) wall
> shorten branches : 0.12 ( 0%) usr 0.00 ( 0%) sys 0.12 ( 0%) wall
> final : 0.20 ( 0%) usr 0.04 ( 4%) sys 0.24 ( 0%) wall
> rest of compilation : 0.72 ( 1%) usr 0.01 ( 1%) sys 0.70 ( 1%) wall
> TOTAL : 111.58 0.98 112.56
>
>
> If I turn on tree-pre, then it looks like this:
>
> Execution times (seconds)
> garbage collection : 269.10 (29%) usr 0.18 ( 5%) sys 268.95 (28%) wall
> callgraph construction: 0.14 ( 0%) usr 0.00 ( 0%) sys 0.15 ( 0%) wall
> cfg construction : 0.55 ( 0%) usr 0.00 ( 0%) sys 0.54 ( 0%) wall
> cfg cleanup : 0.62 ( 0%) usr 0.00 ( 0%) sys 0.65 ( 0%) wall
> trivially dead code : 0.31 ( 0%) usr 0.00 ( 0%) sys 0.33 ( 0%) wall
> life analysis : 3.36 ( 0%) usr 0.00 ( 0%) sys 3.35 ( 0%) wall
> life info update : 2.65 ( 0%) usr 0.00 ( 0%) sys 2.63 ( 0%) wall
> alias analysis : 0.50 ( 0%) usr 0.00 ( 0%) sys 0.50 ( 0%) wall
> register scan : 0.20 ( 0%) usr 0.00 ( 0%) sys 0.20 ( 0%) wall
> rebuild jump labels : 0.12 ( 0%) usr 0.00 ( 0%) sys 0.11 ( 0%) wall
> preprocessing : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 0%) wall
> parser : 1.98 ( 0%) usr 0.06 ( 2%) sys 2.05 ( 0%) wall
> name lookup : 0.07 ( 0%) usr 0.01 ( 0%) sys 0.05 ( 0%) wall
> integration : 2.17 ( 0%) usr 0.01 ( 0%) sys 2.18 ( 0%) wall
> tree gimplify : 0.33 ( 0%) usr 0.00 ( 0%) sys 0.34 ( 0%) wall
> tree eh : 0.15 ( 0%) usr 0.01 ( 0%) sys 0.15 ( 0%) wall
> tree CFG construction : 0.61 ( 0%) usr 0.00 ( 0%) sys 0.61 ( 0%) wall
> tree CFG cleanup : 0.65 ( 0%) usr 0.00 ( 0%) sys 0.67 ( 0%) wall
> tree must-alias : 0.03 ( 0%) usr 0.00 ( 0%) sys 0.03 ( 0%) wall
> tree PHI insertion : 12.48 ( 1%) usr 0.02 ( 1%) sys 12.51 ( 1%) wall
> tree SSA rewrite : 0.10 ( 0%) usr 0.01 ( 0%) sys 0.11 ( 0%) wall
> tree SSA other : 0.24 ( 0%) usr 0.03 ( 1%) sys 0.26 ( 0%) wall
> tree thread jumps : 0.27 ( 0%) usr 0.02 ( 1%) sys 0.28 ( 0%) wall
> dominator optimization: 0.92 ( 0%) usr 0.33 ( 9%) sys 1.25 ( 0%) wall
> tree CCP : 0.23 ( 0%) usr 0.00 ( 0%) sys 0.22 ( 0%) wall
> tree PRE : 562.07 (60%) usr 0.93 (25%) sys 576.33 (60%) wall
> tree COPYPROP : 0.04 ( 0%) usr 0.00 ( 0%) sys 0.03 ( 0%) wall
> tree DCE : 0.21 ( 0%) usr 0.00 ( 0%) sys 0.20 ( 0%) wall
> tree SSA to normal : 1.14 ( 0%) usr 1.59 (42%) sys 3.17 ( 0%) wall
> dominance frontiers : 0.04 ( 0%) usr 0.00 ( 0%) sys 0.04 ( 0%) wall
> expand : 0.50 ( 0%) usr 0.05 ( 1%) sys 0.60 ( 0%) wall
> varconst : 0.00 ( 0%) usr 0.01 ( 0%) sys 0.00 ( 0%) wall
> jump : 2.71 ( 0%) usr 0.02 ( 1%) sys 2.72 ( 0%) wall
> CSE : 1.28 ( 0%) usr 0.00 ( 0%) sys 1.31 ( 0%) wall
> global CSE : 4.17 ( 0%) usr 0.39 (10%) sys 4.55 ( 0%) wall
> loop analysis : 0.05 ( 0%) usr 0.00 ( 0%) sys 0.03 ( 0%) wall
> bypass jumps : 0.61 ( 0%) usr 0.07 ( 2%) sys 0.68 ( 0%) wall
> CSE 2 : 0.38 ( 0%) usr 0.00 ( 0%) sys 0.37 ( 0%) wall
> branch prediction : 1.76 ( 0%) usr 0.00 ( 0%) sys 1.74 ( 0%) wall
> flow analysis : 0.07 ( 0%) usr 0.00 ( 0%) sys 0.06 ( 0%) wall
> combiner : 9.36 ( 1%) usr 0.00 ( 0%) sys 9.36 ( 1%) wall
> if-conversion : 3.28 ( 0%) usr 0.00 ( 0%) sys 3.29 ( 0%) wall
> regmove : 0.17 ( 0%) usr 0.00 ( 0%) sys 0.17 ( 0%) wall
> mode switching : 0.01 ( 0%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall
> local alloc : 0.36 ( 0%) usr 0.00 ( 0%) sys 0.37 ( 0%) wall
> global alloc : 16.83 ( 2%) usr 0.00 ( 0%) sys 16.83 ( 2%) wall
> reload CSE regs : 2.04 ( 0%) usr 0.01 ( 0%) sys 2.04 ( 0%) wall
> flow 2 : 0.27 ( 0%) usr 0.00 ( 0%) sys 0.29 ( 0%) wall
> if-conversion 2 : 1.15 ( 0%) usr 0.00 ( 0%) sys 1.16 ( 0%) wall
> peephole 2 : 0.10 ( 0%) usr 0.00 ( 0%) sys 0.10 ( 0%) wall
> rename registers : 3.74 ( 0%) usr 0.02 ( 1%) sys 3.76 ( 0%) wall
> scheduling 2 : 31.91 ( 3%) usr 0.00 ( 0%) sys 31.90 ( 3%) wall
> reorder blocks : 0.17 ( 0%) usr 0.00 ( 0%) sys 0.18 ( 0%) wall
> shorten branches : 0.12 ( 0%) usr 0.00 ( 0%) sys 0.11 ( 0%) wall
> final : 0.23 ( 0%) usr 0.01 ( 0%) sys 0.25 ( 0%) wall
> rest of compilation : 0.69 ( 0%) usr 0.00 ( 0%) sys 0.71 ( 0%) wall
> TOTAL : 943.25 3.79 960.50
>
>
> Clearly PRE is still doing something that's not terribly intelligent given
> that PRE + the increase the GC time accounts for 90% of the total
> compilation time for this file.
As I said, it's being worked on.
This also looks like it was done with checking on.
Please turn checking off and try again.
Checking now changes the GC heuristics so that they aren't tuned to the
machine (it's 30/4096 now, IIRC).
This causes an incredible number of collections to occur that wouldn't
have occurred before.
Even without checking, however, the GC part of it is *not* something i
can fix alone, however. We ggc_alloc *everything* in tree-ssa, for no good
reason.
For example, the *ops arrays are ggc_alloced, when we *always* know
their lifetime.
--Dan