diff options
author | Eugene Rozenfeld <erozen@microsoft.com> | 2023-02-28 15:58:40 -0800 |
---|---|---|
committer | Eugene Rozenfeld <erozen@microsoft.com> | 2023-05-08 15:12:17 -0700 |
commit | 3d9853eeb2de07d26511c2335a29db8eeadb4d98 (patch) | |
tree | fa06ec69b4e564f31b32be537ee0f3d1c3c6c56c | |
parent | 5d85b5d649fff675ff00adcc99371bccf4ef5944 (diff) | |
download | gcc-3d9853eeb2de07d26511c2335a29db8eeadb4d98.zip gcc-3d9853eeb2de07d26511c2335a29db8eeadb4d98.tar.gz gcc-3d9853eeb2de07d26511c2335a29db8eeadb4d98.tar.bz2 |
Fix cfg maintenance after inlining in AutoFDO
Todo from early_inliner needs to be propagated so that
cleanup_tree_cfg () is called if necessary.
This bug was causing an assert in get_loop_body during
ipa-sra in autoprofiledbootstrap build since loops weren't
fixed up and one of the loops had num_nodes set to 0.
Tested on x86_64-pc-linux-gnu.
gcc/ChangeLog:
* auto-profile.cc (auto_profile): Check todo from early_inline
to see if cleanup_tree_vfg needs to be called.
(early_inline): Return todo from early_inliner.
-rw-r--r-- | gcc/auto-profile.cc | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc index 360c42c..e3af355 100644 --- a/gcc/auto-profile.cc +++ b/gcc/auto-profile.cc @@ -1589,13 +1589,14 @@ afdo_annotate_cfg (const stmt_set &promoted_stmts) /* Wrapper function to invoke early inliner. */ -static void +static unsigned int early_inline () { compute_fn_summary (cgraph_node::get (current_function_decl), true); - unsigned todo = early_inliner (cfun); + unsigned int todo = early_inliner (cfun); if (todo & TODO_update_ssa_any) update_ssa (TODO_update_ssa); + return todo; } /* Use AutoFDO profile to annoate the control flow graph. @@ -1651,20 +1652,22 @@ auto_profile (void) function before annotation, so the profile inside bar@loc_foo2 will be useful. */ autofdo::stmt_set promoted_stmts; + unsigned int todo = 0; for (int i = 0; i < 10; i++) { - if (!flag_value_profile_transformations - || !autofdo::afdo_vpt_for_early_inline (&promoted_stmts)) - break; - early_inline (); + if (!flag_value_profile_transformations + || !autofdo::afdo_vpt_for_early_inline (&promoted_stmts)) + break; + todo |= early_inline (); } - early_inline (); + todo |= early_inline (); autofdo::afdo_annotate_cfg (promoted_stmts); compute_function_frequency (); /* Local pure-const may imply need to fixup the cfg. */ - if (execute_fixup_cfg () & TODO_cleanup_cfg) + todo |= execute_fixup_cfg (); + if (todo & TODO_cleanup_cfg) cleanup_tree_cfg (); free_dominance_info (CDI_DOMINATORS); @@ -1674,7 +1677,7 @@ auto_profile (void) pop_cfun (); } - return TODO_rebuild_cgraph_edges; + return 0; } } /* namespace autofdo. */ |