https://gcc.gnu.org/g:d9faa7c2eb47c7fabf9dafce6d569f52d49c7030
commit r14-11514-gd9faa7c2eb47c7fabf9dafce6d569f52d49c7030 Author: Richard Biener <rguent...@suse.de> Date: Fri Feb 28 11:44:26 2025 +0100 ipa/111245 - bogus modref analysis for store in call that might throw We currently record a kill for *x_4(D) = always_throws (); because we consider the store always executing since the appropriate check for whether the stmt could throw is guarded by !cfun->can_throw_non_call_exceptions. PR ipa/111245 * ipa-modref.cc (modref_access_analysis::analyze_store): Do not guard the check of whether the stmt could throw by cfun->can_throw_non_call_exceptions. * g++.dg/torture/pr111245.C: New testcase. (cherry picked from commit e6037af6d5e5a43c437257580d75bc8b35a6dcfd) Diff: --- gcc/ipa-modref.cc | 3 +-- gcc/testsuite/g++.dg/torture/pr111245.C | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc index 400a8856de2d..b38bb7cf449d 100644 --- a/gcc/ipa-modref.cc +++ b/gcc/ipa-modref.cc @@ -1747,8 +1747,7 @@ modref_access_analysis::analyze_store (gimple *stmt, tree, tree op, void *data) t->record_access_lto (t->m_summary_lto->stores, &r, a); if (t->m_always_executed && a.useful_for_kill_p () - && (!cfun->can_throw_non_call_exceptions - || !stmt_could_throw_p (cfun, stmt))) + && !stmt_could_throw_p (cfun, stmt)) { if (dump_file) fprintf (dump_file, " - Recording kill\n"); diff --git a/gcc/testsuite/g++.dg/torture/pr111245.C b/gcc/testsuite/g++.dg/torture/pr111245.C new file mode 100644 index 000000000000..785f4a51761d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr111245.C @@ -0,0 +1,23 @@ +/* { dg-do run } */ + +struct Int { + int value; +}; + +__attribute__((noipa)) Int always_throws() { throw 123; } + +void foo(Int &x) { + try { + x = always_throws(); + } catch (...) { + } +} + +int main() +{ + Int x; + x.value = 5; + foo(x); + if (x.value != 5) + __builtin_abort (); +}