aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Rozenfeld <erozen@microsoft.com>2023-02-28 15:58:40 -0800
committerEugene Rozenfeld <erozen@microsoft.com>2023-05-08 15:12:17 -0700
commit3d9853eeb2de07d26511c2335a29db8eeadb4d98 (patch)
treefa06ec69b4e564f31b32be537ee0f3d1c3c6c56c
parent5d85b5d649fff675ff00adcc99371bccf4ef5944 (diff)
downloadgcc-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.cc21
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. */