]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Terminate BB analysis on NULL memory access in ipa-pure-const and ipa-modref
authorJan Hubicka <jh@suse.cz>
Sun, 12 Dec 2021 10:38:13 +0000 (11:38 +0100)
committerJan Hubicka <jh@suse.cz>
Sun, 12 Dec 2021 10:38:13 +0000 (11:38 +0100)
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.

Bootstrapped/regtested x86_64-linux, comitted.

gcc/ChangeLog:

2021-12-12  Jan Hubicka  <hubicka@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.

gcc/ipa-modref.c
gcc/ipa-pure-const.c

index 55fa873e1f0507cae2855dccc04cfcb1e5831a5d..2c89c63baf67a13820425bdd9b99df55708deddf 100644 (file)
@@ -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.  */
index fea8b08c4eb7fc673eb4fddb6d902032e5b865e5..25503f360e646effa36292b3043935c024f1cc4d 100644 (file)
@@ -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