On Tue, Aug 12, 2025 at 8:59 AM Andrew Pinski
<andrew.pin...@oss.qualcomm.com> wrote:
>
> From: Andrew Pinski <andrew.pin...@oss.qualcomm.com>
>
> 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.

OK.

>         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.pin...@oss.qualcomm.com>
> ---
>  gcc/tree-ssa-forwprop.cc | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index 1cde5f85150..4237a2013ba 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -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;
>      }
> --
> 2.34.1
>

Reply via email to