]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
forwprop: Fix non-call exceptions some more with copy prop for aggregates [PR121494]
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Mon, 11 Aug 2025 20:47:30 +0000 (20:47 +0000)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 12 Aug 2025 08:06:23 +0000 (08:06 +0000)
Note this conflicts with my not yet approved patch for copy prop for aggregates into
function arguments (I will get back to that soon).

So the problem here is that I assumed if:
*a = decl1;
would not cause an exception that:
decl2 = *a;
would cause not cause one too.

I was wrong, in some cases where the Ada front-end marks `*a` in the store
as TREE_THIS_NOTRAP (due to knowing never be null or some other cases).
So that means when we prop decl1 into the statement storing decl2, we need to
mark that statement as possible to cleanup for eh.

Bootstraped and tested on x86_64-linux-gnu.
Also tested on x86_64-linux-gnu with a hack to force generate LC constant decls in the gimplifier.

PR tree-optimization/121494
gcc/ChangeLog:

* tree-ssa-forwprop.cc (optimize_agr_copyprop): Mark the bb of the use
stmt if needed for eh cleanup.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
gcc/tree-ssa-forwprop.cc

index 1cde5f85150e040999b01f5103fb479d480e006f..4237a2013badec6f9c7fbe81fcadc5ee0bcfa526 100644 (file)
@@ -1487,6 +1487,7 @@ optimize_agr_copyprop (gimple_stmt_iterator *gsip)
          fprintf (dump_file, "after previous\n  ");
          print_gimple_stmt (dump_file, stmt, 0, dump_flags);
        }
+      gimple *orig_stmt = use_stmt;
       gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
       gimple_assign_set_rhs_from_tree (&gsi, unshare_expr (src));
       update_stmt (use_stmt);
@@ -1496,6 +1497,10 @@ optimize_agr_copyprop (gimple_stmt_iterator *gsip)
          fprintf (dump_file, "into\n  ");
          print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
        }
+
+      /* Mark the bb for eh cleanup if needed.  */
+      if (maybe_clean_or_replace_eh_stmt (orig_stmt, use_stmt))
+       bitmap_set_bit (to_purge, gimple_bb (stmt)->index);
       statistics_counter_event (cfun, "copy prop for aggregate", 1);
       changed = true;
     }