On Wed, Aug 6, 2025 at 7:30 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > In the testcase provided, currently we lose the landing pad for the exception > that could > throw from the aggregate load as we remove one copy and the second statement > where load > happens was not marked as throwable before so the landing pad for that > internal throw is > now gone. > > The fix is to ignore statements that could throw (internally or externally).
OK. Thanks, Richard. > PR tree-optimization/120599 > > gcc/ChangeLog: > > * tree-ssa-forwprop.cc (optimize_agr_copyprop): Don't try to copy > from statements that throw. > > gcc/testsuite/ChangeLog: > > * g++.dg/torture/noncall-eh-1.C: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/testsuite/g++.dg/torture/noncall-eh-1.C | 26 +++++++++++++++++++++ > gcc/tree-ssa-forwprop.cc | 4 ++++ > 2 files changed, 30 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/torture/noncall-eh-1.C > > diff --git a/gcc/testsuite/g++.dg/torture/noncall-eh-1.C > b/gcc/testsuite/g++.dg/torture/noncall-eh-1.C > new file mode 100644 > index 00000000000..ea8fd7953f5 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/torture/noncall-eh-1.C > @@ -0,0 +1,26 @@ > +// { dg-do compile } > +// For slim LTO there's no optimized dump > +// { dg-skip-if "" { *-*-* } { "-flto" } { "" } } > +// { dg-additional-options "-fnon-call-exceptions -fexceptions > -fdump-tree-optimized-eh" } > + > +// PR tree-optimization/120599 > +// Copying prop for aggregates should not touch `a = *__val` since that > statement > +// can throw (internally) so we need to be able to keep the landing pad. > + > +struct RefitOption { > + char subtype; > + int string; > +} n; > +void h(RefitOption) __attribute__((nothrow)); > +void k(RefitOption *__val, RefitOption a) > +{ > + try { > + a = *__val; > + RefitOption __trans_tmp_2 = a; > + h(__trans_tmp_2); > + } > + catch(...){} > +} > + > +// Make sure There is a landing pad for the non-call exception from the > aggregate load. > +// { dg-final { scan-tree-dump "LP " "optimized" } } > diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc > index 156ea322867..3d38d88844b 100644 > --- a/gcc/tree-ssa-forwprop.cc > +++ b/gcc/tree-ssa-forwprop.cc > @@ -1417,6 +1417,10 @@ optimize_agr_copyprop (gimple_stmt_iterator *gsip) > if (gimple_has_volatile_ops (stmt)) > return false; > > + /* Can't prop if the statement could throw. */ > + if (stmt_could_throw_p (cfun, stmt)) > + return false; > + > tree dest = gimple_assign_lhs (stmt); > tree src = gimple_assign_rhs1 (stmt); > /* If the statement is `src = src;` then ignore it. */ > -- > 2.43.0 >