On 12-06-11 14:45 , Lawrence Crowl wrote:
The intent of the phases was to have a high-level but mutually exclusive
accounting of compile time.  We want to track compile time in a way that
tells us which conceptual phases are taking the most time.  That intent
is not currently satisfied.  This patch restores that intent.

Add code to verify that the sum of the phase times is less than the total
time, to detect when phases are overlapped.  A slight amount of leeway
is required due to time jitters.  This verification is done as the last
step in printing timevars so that any timevar information is not lost.

Rename the phases to be clearer about what they measure, so that they are
less likely to be modified to be overlapping.  The primary example is
to change TV_PHASE_GENERATE to TV_PHASE_LATE_ASM, meaning late work on
the assembly.  This name change avoids confusion n moving the timevar
start call after the call to lang_hooks.decls.final_write_globals,
which prevents overlapping phases.

Each implementation of lang_hooks.decls.final_write_globals, is
responsible for starting and stopping its own phases.  Each implementation
currently has a first phase of TV_PHASE_DEFERRED for front-end work
deferred until after parsing is complete.  The second phase has been
renamed from TV_PHASE_CGRAPH to TV_PHASE_OPT_GEN, to better reflect its
use as the main optimization and generation phase.  This phase accounts
for 70%-80% of compilation time.  The third phase is TV_PHASE_DBGINFO,
except in cp/decl2.c, where it is TV_PHASE_CHECK_DBGINFO because
cc1plus mixes checking in with debug info generation.  In langhooks.c,
write_global_declarations was using TV_PHASE_CHECK_DBGINFO, but it was
doing no checking.  So, it now uses TV_PHASE_DBGINFO.

The changes to LTO are significant.  First, initialization now uses
TV_PHASE_SETUP.  Reading files now uses TV_PHASE_STREAM_IN.  Writing files
now uses TV_PHASE_STREAM_OUT.  The remaining phase is TV_PHASE_OPT_GEN
(formerly TV_PHASE_CGRAPH).

Tested on x86_64.

Okay for trunk?


Index: gcc/ChangeLog

2012-06-11  Lawrence Crowl<cr...@google.com>

        * timevar.def (TV_PHASE_GENERATE): Rename to TV_PHASE_LATE_ASM.
        (TV_PHASE_CGRAPH): Rename to TV_PHASE_OPT_GEN.
        (TV_PHASE_STREAM_IN): New.
        (TV_PHASE_STREAM_OUT): New.
        * timevar.c (validate_phases): New.
        (timevar_print): Call validate_phases.
        * c-decl.c (c_write_global_declarations): Rename use of TV_PHASE_CGRAPH
        to TV_PHASE_OPT_GEN.
        * langhooks.c (write_global_declarations): Rename use of
        TV_PHASE_CGRAPH to TV_PHASE_OPT_GEN.  Use TV_PHASE_DBGINFO instead of
        TV_PHASE_CHECK_DBGINFO.
        * toplev.c (compile_file): Rename use of TV_PHASE_GENERATE to
        TV_PHASE_LATE_ASM.  Move start of TV_PHASE_LATE_ASM to after call to
        lang_hooks.decls.final_write_globals.

Index: gcc/cp/ChangeLog

2012-06-11  Lawrence Crowl<cr...@google.com>

        * decl2.c (cp_write_global_declarations): Rename use of TV_PHASE_CGRAPH
        to TV_PHASE_OPT_GEN.

Index: gcc/lto/ChangeLog

2012-06-11  Lawrence Crowl<cr...@google.com>

         * lto.c (do_whole_program_analysis):  Rename use of TV_PHASE_CGRAPH to
        TV_PHASE_OPT_GEN.  Use new timevar TV_PHASE_STREAM_OUT around the call
        to lto_wpa_write_files.
        (lto_main):  Rename use of TV_PHASE_CGRAPH to TV_PHASE_OPT_GEN.  Move
        start of TV_PHASE_OPT_GEN to include call to materialize_cgraph.  Use
        TV_PHASE_SETUP for the call to lto_init.  Use new timevar
        TV_PHASE_STREAM_IN around the call to read_cgraph_and_symbols.

The LTO bits are fine. I would prefer if an FE maintainer takes a second look over the other bits. Jason, Joseph?


Thanks.  Diego.

Reply via email to