diff options
author | Martin Jambor <mjambor@suse.cz> | 2021-11-27 01:00:56 +0100 |
---|---|---|
committer | Martin Jambor <mjambor@suse.cz> | 2021-11-27 01:01:46 +0100 |
commit | 9e2e47391b316493b52fbb47b4b992b0863795dd (patch) | |
tree | c7814635be4235c151fd499188df1bbe1e7ff28c | |
parent | 52b769437a4d1ca50f4ef5bdad65b12115ded845 (diff) | |
download | gcc-9e2e47391b316493b52fbb47b4b992b0863795dd.zip gcc-9e2e47391b316493b52fbb47b4b992b0863795dd.tar.gz gcc-9e2e47391b316493b52fbb47b4b992b0863795dd.tar.bz2 |
ipa: Fix CFG fix-up in IPA-CP transform phase (PR 103441)
I forgot that IPA passes before ipa-inline must not return
TODO_cleanup_cfg from their transformation function because ordinary
CFG cleanup does not remove call graph edges associated with removed
call statements but must use
delete_unreachable_blocks_update_callgraph instead. This patch fixes
that error.
gcc/ChangeLog:
2021-11-26 Martin Jambor <mjambor@suse.cz>
PR ipa/103441
* ipa-prop.c (ipcp_transform_function): Call
delete_unreachable_blocks_update_callgraph instead of returning
TODO_cleanup_cfg.
-rw-r--r-- | gcc/ipa-prop.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index a297f50..bc56432 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -6001,7 +6001,6 @@ ipcp_transform_function (struct cgraph_node *node) struct ipa_func_body_info fbi; struct ipa_agg_replacement_value *aggval; int param_count; - bool something_changed = false; gcc_checking_assert (cfun); gcc_checking_assert (current_function_decl); @@ -6022,14 +6021,16 @@ ipcp_transform_function (struct cgraph_node *node) ipa_populate_param_decls (node, *descriptors); std::pair<bool, bool> rr = adjust_agg_replacement_values (node, aggval, *descriptors); - int retval = rr.second ? TODO_cleanup_cfg : 0; + bool cfg_changed = rr.second; if (!rr.first) { vec_free (descriptors); if (dump_file) fprintf (dump_file, " All affected aggregate parameters were either " "removed or converted into scalars, phase done.\n"); - return retval; + if (cfg_changed) + delete_unreachable_blocks_update_callgraph (node, false); + return 0; } if (dump_file) ipa_dump_agg_replacement_values (dump_file, aggval); @@ -6041,11 +6042,12 @@ ipcp_transform_function (struct cgraph_node *node) fbi.param_count = param_count; fbi.aa_walk_budget = opt_for_fn (node->decl, param_ipa_max_aa_steps); + bool modified_mem_access = false; calculate_dominance_info (CDI_DOMINATORS); - ipcp_modif_dom_walker walker (&fbi, descriptors, aggval, &something_changed); + ipcp_modif_dom_walker walker (&fbi, descriptors, aggval, &modified_mem_access); walker.walk (ENTRY_BLOCK_PTR_FOR_FN (cfun)); free_dominance_info (CDI_DOMINATORS); - bool cfg_changed = walker.cleanup_eh (); + cfg_changed |= walker.cleanup_eh (); int i; struct ipa_bb_info *bi; @@ -6059,14 +6061,10 @@ ipcp_transform_function (struct cgraph_node *node) s->m_vr = NULL; vec_free (descriptors); - - if (!something_changed) - return retval; - if (cfg_changed) delete_unreachable_blocks_update_callgraph (node, false); - return retval | TODO_update_ssa_only_virtuals; + return modified_mem_access ? TODO_update_ssa_only_virtuals : 0; } |