Now that both statement fixup and cfg cleanup are moved after annotation. So setting of cgraph node's count is still needed, right?
Thanks, Dehao On Thu, Sep 19, 2013 at 9:28 PM, Xinliang David Li <davi...@google.com> wrote: > I did not catch this in the last review. The cleanup CFG should be > done before afdo_annotate_cfg and just after call statement fixup. > Otherwise the cfg cleanup will zero out all profile counts. After > moving this up, you don't need the follow up patch which sets the > cgraph node's count -- that should be done in the > rebuild_cgraph_edges. > > David > > On Thu, Sep 19, 2013 at 10:10 AM, Dehao Chen <de...@google.com> wrote: >> Thanks, patch updated: >> >> Index: gcc/Makefile.in >> =================================================================== >> --- gcc/Makefile.in (revision 202725) >> +++ gcc/Makefile.in (working copy) >> @@ -2960,7 +2960,7 @@ coverage.o : coverage.c $(GCOV_IO_H) $(CONFIG_H) $ >> auto-profile.o : auto-profile.c $(CONFIG_H) $(SYSTEM_H) $(FLAGS_H) \ >> $(BASIC_BLOCK_H) $(DIAGNOSTIC_CORE_H) $(GCOV_IO_H) $(INPUT_H) profile.h \ >> $(LANGHOOKS_H) $(OPTS_H) $(TREE_PASS_H) $(CGRAPH_H) $(GIMPLE_H) >> value-prof.h \ >> - $(COVERAGE_H) coretypes.h $(TREE_H) $(PARAMS_H) $(AUTO_PROFILE_H) >> + $(COVERAGE_H) coretypes.h $(TREE_H) $(PARAMS_H) l-ipo.h $(AUTO_PROFILE_H) >> cselib.o : cselib.c $(CONFIG_H) $(SYSTEM_H) coretypes.h dumpfile.h >> $(TM_H) $(RTL_H) \ >> $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h $(RECOG_H) \ >> $(EMIT_RTL_H) $(DIAGNOSTIC_CORE_H) $(FUNCTION_H) \ >> Index: gcc/auto-profile.c >> =================================================================== >> --- gcc/auto-profile.c (revision 202725) >> +++ gcc/auto-profile.c (working copy) >> @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see >> #include "value-prof.h" >> #include "coverage.h" >> #include "params.h" >> +#include "l-ipo.h" >> #include "auto-profile.h" >> >> /* The following routines implements AutoFDO optimization. >> @@ -1290,6 +1291,13 @@ auto_profile (void) >> init_node_map (); >> profile_info = autofdo::afdo_profile_info; >> >> + cgraph_pre_profiling_inlining_done = true; >> + cgraph_process_module_scope_statics (); >> + /* Now perform link to allow cross module inlining. */ >> + cgraph_do_link (); >> + varpool_do_link (); >> + cgraph_unify_type_alias_sets (); >> + >> FOR_EACH_FUNCTION (node) >> { >> if (!gimple_has_body_p (node->symbol.decl)) >> @@ -1301,21 +1309,33 @@ auto_profile (void) >> >> push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); >> >> + if (L_IPO_COMP_MODE) >> + { >> + basic_block bb; >> + FOR_EACH_BB (bb) >> + { >> + gimple_stmt_iterator gsi; >> + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) >> + { >> + gimple stmt = gsi_stmt (gsi); >> + if (is_gimple_call (stmt)) >> + lipo_fixup_cgraph_edge_call_target (stmt); >> + } >> + } >> + } >> + >> autofdo::afdo_annotate_cfg (); >> compute_function_frequency (); >> update_ssa (TODO_update_ssa); >> >> + /* Local pure-const may imply need to fixup the cfg. */ >> + if (execute_fixup_cfg () & TODO_cleanup_cfg) >> + cleanup_tree_cfg (); >> + >> current_function_decl = NULL; >> pop_cfun (); >> } >> >> - cgraph_pre_profiling_inlining_done = true; >> - cgraph_process_module_scope_statics (); >> - /* Now perform link to allow cross module inlining. */ >> - cgraph_do_link (); >> - varpool_do_link (); >> - cgraph_unify_type_alias_sets (); >> - >> return TODO_rebuild_cgraph_edges; >> } >> >> On Wed, Sep 18, 2013 at 5:16 PM, Xinliang David Li <davi...@google.com> >> wrote: >>> On Wed, Sep 18, 2013 at 4:51 PM, Dehao Chen <de...@google.com> wrote: >>>> This patch fixup the call graph edge targets during AutoFDO pass, so >>>> that when rebuilding call graph edges, it can find the correct callee. >>>> >>>> Bootstrapped and passed regression test. Benchmark tests on-going. >>>> >>>> Ok for google-4_8 branch? >>>> >>>> Thanks, >>>> Dehao >>>> >>>> Index: gcc/Makefile.in >>>> =================================================================== >>>> --- gcc/Makefile.in (revision 202725) >>>> +++ gcc/Makefile.in (working copy) >>>> @@ -2960,7 +2960,7 @@ coverage.o : coverage.c $(GCOV_IO_H) $(CONFIG_H) $ >>>> auto-profile.o : auto-profile.c $(CONFIG_H) $(SYSTEM_H) $(FLAGS_H) \ >>>> $(BASIC_BLOCK_H) $(DIAGNOSTIC_CORE_H) $(GCOV_IO_H) $(INPUT_H) >>>> profile.h \ >>>> $(LANGHOOKS_H) $(OPTS_H) $(TREE_PASS_H) $(CGRAPH_H) $(GIMPLE_H) >>>> value-prof.h \ >>>> - $(COVERAGE_H) coretypes.h $(TREE_H) $(PARAMS_H) $(AUTO_PROFILE_H) >>>> + $(COVERAGE_H) coretypes.h $(TREE_H) $(PARAMS_H) l-ipo.h >>>> $(AUTO_PROFILE_H) >>>> cselib.o : cselib.c $(CONFIG_H) $(SYSTEM_H) coretypes.h dumpfile.h >>>> $(TM_H) $(RTL_H) \ >>>> $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h $(RECOG_H) \ >>>> $(EMIT_RTL_H) $(DIAGNOSTIC_CORE_H) $(FUNCTION_H) \ >>>> Index: gcc/auto-profile.c >>>> =================================================================== >>>> --- gcc/auto-profile.c (revision 202725) >>>> +++ gcc/auto-profile.c (working copy) >>>> @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see >>>> #include "value-prof.h" >>>> #include "coverage.h" >>>> #include "params.h" >>>> +#include "l-ipo.h" >>>> #include "auto-profile.h" >>>> >>>> /* The following routines implements AutoFDO optimization. >>>> @@ -1290,6 +1291,13 @@ auto_profile (void) >>>> init_node_map (); >>>> profile_info = autofdo::afdo_profile_info; >>>> >>>> + cgraph_pre_profiling_inlining_done = true; >>>> + cgraph_process_module_scope_statics (); >>>> + /* Now perform link to allow cross module inlining. */ >>>> + cgraph_do_link (); >>>> + varpool_do_link (); >>>> + cgraph_unify_type_alias_sets (); >>>> + >>>> FOR_EACH_FUNCTION (node) >>>> { >>>> if (!gimple_has_body_p (node->symbol.decl)) >>>> @@ -1301,6 +1309,21 @@ auto_profile (void) >>>> >>>> push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); >>>> >>>> + if (L_IPO_COMP_MODE) >>>> + { >>>> + basic_block bb; >>>> + FOR_EACH_BB (bb) >>>> + { >>>> + gimple_stmt_iterator gsi; >>>> + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) >>>> + { >>>> + gimple stmt = gsi_stmt (gsi); >>>> + if (is_gimple_call (stmt)) >>>> + lipo_fixup_cgraph_edge_call_target (stmt); >>>> + } >>>> + } >>>> + } >>>> + >>> >>> Need this: >>> >>> >>> if (execute_fixup_cfg () & TODO_cleanup_cfg) >>> cleanup_tree_cfg (); >>> >>> >>> as in tree-profiling. Changing call stmt targets can lead to CFG changes. >>> >>> >>> >>> David >>> >>>> autofdo::afdo_annotate_cfg (); >>>> compute_function_frequency (); >>>> update_ssa (TODO_update_ssa); >>>> @@ -1309,13 +1332,6 @@ auto_profile (void) >>>> pop_cfun (); >>>> } >>>> >>>> - cgraph_pre_profiling_inlining_done = true; >>>> - cgraph_process_module_scope_statics (); >>>> - /* Now perform link to allow cross module inlining. */ >>>> - cgraph_do_link (); >>>> - varpool_do_link (); >>>> - cgraph_unify_type_alias_sets (); >>>> - >>>> return TODO_rebuild_cgraph_edges; >>>> }