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))
+           {
+             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

Reply via email to