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 ();
+}

Reply via email to