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; >> }