On December 12, 2021 11:49:12 AM GMT+01:00, Jan Hubicka via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: >Hi, >As discussed in the PR, we miss some optimization becuase >gimple-ssa-isolate-paths turns NULL memory accesses to volatile and adds >__builtin_trap after them. This is seen as a side-effect by IPA analysis >and additionally the (fully unreachable) builtin_trap is believed to load >all global memory. > >I think we should think of less intrusive gimple representation of this, but >it is also easy enough to special case that in IPA analysers as done in >this patch. This is a win even if we improve the representation since >gimple-ssa-isolate-paths is run late and this way we improve optimization >early. > >This affects 1623 functions during cc1plus link. >Current cc1plus disambiguation stats are: > >Alias oracle query stats: > > refs_may_alias_p: 76712244 disambiguations, 90400285 queries > > ref_maybe_used_by_call_p: 581770 disambiguations, 77716066 queries > > call_may_clobber_ref_p: 322533 disambiguations, 325280 queries > > stmt_kills_ref_p: 106434 kills, 5728738 queries > > nonoverlapping_component_refs_p: 0 disambiguations, 8849 queries > > nonoverlapping_refs_since_match_p: 29947 disambiguations, 66277 must > overlaps, 97248 queries > aliasing_component_refs_p: 55737 disambiguations, 3055719 queries > > TBAA oracle: 27336487 disambiguations 67140201 queries > > 16214932 are in alias set 0 > > 9713534 queries asked about the same object > > 92 queries asked about the same alias set > > 0 access volatile > > 12049850 are dependent in the DAG > > 1825306 are aritificially in conflict with void * > > > >Modref stats: > > modref kill: 70 kills, 8279 queries > > modref use: 29557 disambiguations, 701616 queries > > modref clobber: 1612655 disambiguations, 21688020 queries > > 4925889 tbaa queries (0.227125 per modref query) > > 864389 base compares (0.039856 per modref query) > > > >PTA query stats: > > pt_solution_includes: 13512509 disambiguations, 27571176 queries > > pt_solutions_intersect: 1594296 disambiguations, 15943975 queries > > > >Bootstrapped/regtested x86_64-linux, comitted. > >gcc/ChangeLog: > >2021-12-12 Jan Hubicka <hubi...@ucw.cz> > > PR ipa/103665 > * ipa-modref.c (modref_access_analysis::analyze): Terminate BB > analysis on NULL memory access. > * ipa-pure-const.c (analyze_function): Likewise. > >diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c >index 55fa873e1f0..2c89c63baf6 100644 >--- a/gcc/ipa-modref.c >+++ b/gcc/ipa-modref.c >@@ -1750,6 +1750,19 @@ modref_access_analysis::analyze () > for (si = gsi_start_nondebug_after_labels_bb (bb); > !gsi_end_p (si); gsi_next_nondebug (&si)) > { >+ /* NULL memory accesses terminates BB. These accesses are known >+ to trip undefined behaviour. gimple-ssa-isolate-paths turns them >+ to volatile accesses and adds builtin_trap call which would >+ confuse us otherwise. */ >+ if (infer_nonnull_range_by_dereference (gsi_stmt (si), >+ null_pointer_node))
Does that correctly handle flag_delete_null_pointer_checks and address spaces with null? >+ { >+ if (dump_file) >+ fprintf (dump_file, " - NULL memory access; terminating BB\n"); >+ if (flag_non_call_exceptions) >+ set_side_effects (); >+ break; >+ } > analyze_stmt (gsi_stmt (si), always_executed); > > /* Avoid doing useles work. */ >diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c >index fea8b08c4eb..25503f360e6 100644 >--- a/gcc/ipa-pure-const.c >+++ b/gcc/ipa-pure-const.c >@@ -1097,6 +1097,28 @@ analyze_function (struct cgraph_node *fn, bool ipa) > !gsi_end_p (gsi); > gsi_next (&gsi)) > { >+ /* NULL memory accesses terminates BB. These accesses are known >+ to trip undefined behaviour. gimple-ssa-isolate-paths turns them >+ to volatile accesses and adds builtin_trap call which would >+ confuse us otherwise. */ >+ if (infer_nonnull_range_by_dereference (gsi_stmt (gsi), >+ null_pointer_node)) >+ { >+ if (dump_file) >+ fprintf (dump_file, " NULL memory access; terminating BB%s\n", >+ flag_non_call_exceptions ? "; looping" : ""); >+ if (flag_non_call_exceptions) >+ { >+ l->looping = true; >+ if (stmt_can_throw_external (cfun, gsi_stmt (gsi))) >+ { >+ if (dump_file) >+ fprintf (dump_file, " can throw externally\n"); >+ l->can_throw = true; >+ } >+ } >+ break; >+ } > check_stmt (&gsi, l, ipa); > if (l->pure_const_state == IPA_NEITHER > && l->looping