Cleanup ipa-modref
authorJan Hubicka <jh@suse.cz>
Mon, 12 Oct 2020 14:17:10 +0000 (16:17 +0200)
committerJan Hubicka <jh@suse.cz>
Mon, 12 Oct 2020 14:17:10 +0000 (16:17 +0200)
commit71dbabccbfb295c87d91719fe72d9d60511c0b44
tree52fe05fe931eed416791970d44b424171b4113f9
parentf10f11eb63b0ed082674d9a589e67230aa49efb5
Cleanup ipa-modref

this is largely mechanical patch fixing some suboptimal datastructure decision
in modref.  It records three different things
 1) optimization_summaries that are used by tree-ssa-alias to disambiguate
    (computed by local passes or ipa execute)
 2) summaries produced by local analysis and used by the ipa execute
 3) summaries_lto produced by analysis when streaming is expected,
    streamed, used by ipa execute

All three items are stored in "summaries" datastructure where 1 dn 2
are mixed and differentiated by "finished" flags.

This use extra memory and also makes it impossible to use modref while producing
other IPA summaries (by ipa-prop and ipa-devirt).  This patch separates the
summaries into three special purpose datastructures.

There is one fix to propagation in ipa_merge_modref_summary_after_inlining
where check to ignore stores was placed incorrectly. This seems to lead
to increased clobber disambiguations:

Alias oracle query stats:
  refs_may_alias_p: 64267006 disambiguations, 74475486 queries
  ref_maybe_used_by_call_p: 142119 disambiguations, 65169365 queries
  call_may_clobber_ref_p: 22975 disambiguations, 28762 queries
  nonoverlapping_component_refs_p: 0 disambiguations, 36803 queries
  nonoverlapping_refs_since_match_p: 19401 disambiguations, 55550 must overlaps, 75722 queries
  aliasing_component_refs_p: 54714 disambiguations, 759027 queries
  TBAA oracle: 23636760 disambiguations 56001742 queries
               16112157 are in alias set 0
               10614737 queries asked about the same object
               125 queries asked about the same alias set
               0 access volatile
               3994423 are dependent in the DAG
               1643540 are aritificially in conflict with void *

Modref stats:
  modref use: 11667 disambiguations, 40207 queries
  modref clobber: 1508990 disambiguations, 1829697 queries
  3916688 tbaa queries (2.140621 per modref query)
  623504 base compares (0.340769 per modref query)

PTA query stats:
  pt_solution_includes: 967354 disambiguations, 13605701 queries
  pt_solutions_intersect: 1032982 disambiguations, 13121107 queries

Bootstrapped/regtested x86_64-linux. I plan to commit it tomorrow if there are
no complains.

gcc/ChangeLog:

2020-10-11  Jan Hubicka  <hubicka@ucw.cz>

* ipa-modref.c (modref_summaries): Remove field IPA.
(class modref_summary_lto): New global variable.
(class modref_summaries_lto): New.
(modref_summary::modref_summary): Remove loads_lto and stores_lto.
(modref_summary::~modref_summary): Remove loads_lto and stores_lto.
(modref_summary::useful_p): Do not use lto_useful.
(modref_records_lto): New typedef.
(struct modref_summary_lto): New type.
(modref_summary_lto::modref_summary_lto): New member function.
(modref_summary_lto::~modref_summary_lto): New member function.
(modref_summary_lto::useful_p): New member function.
(modref_summary::dump): Do not handle lto.
(modref_summary_lto::dump): New member function.
(get_modref_function_summary): Use optimization_summary.
(merge_call_side_effects): Use optimization_summary.
(analyze_call): Use optimization_summary.
(struct summary_ptrs): New struture.
(analyze_load): Update to handle separate lto and non-lto summaries.
(analyze_store): Likewise.
(analyze_stmt): Likewise.
(remove_summary): Break out from ...
(analyze_function): ... here; update to handle seprated summaries.
(modref_summaries::insert): Do not handle lto summary.
(modref_summaries_lto::insert): New member function.
(modref_summaries::duplicate): Do not handle lto summary.
(modref_summaries_lto::duplicate): New member function.
(read_modref_records): Expect nolto_ret or lto_ret to be NULL>
(modref_write): Write lto summary.
(read_section): Handle separated summaries.
(modref_read): Initialize separated summaries.
(modref_transform): Handle separated summaries.
(pass_modref::execute): Turn summary to optimization_summary; handle
separate summaries.
(ignore_edge): Handle separate summaries.
(ipa_merge_modref_summary_after_inlining): Likewise.
(collapse_loads): Likewise.
(modref_propagate_in_scc): Likewise.
(pass_ipa_modref::execute): Likewise.
(ipa_modref_c_finalize): Likewise.
* ipa-modref.h (modref_records_lto): Remove typedef.
(struct modref_summary): Remove stores_lto, loads_lto and finished
fields; remove lto_useful_p member function.
gcc/ipa-modref.c
gcc/ipa-modref.h