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.
Bootstrap and regtest pending on x86_64-unknown-linux-gnu, will push
after that succeeded.
Thanks,
Richard.
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.
---
gcc/ipa-modref.cc | 3 +--
gcc/testsuite/g++.dg/torture/pr111245.C | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/torture/pr111245.C
diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
index f1d88abf3cf..d3e510195b5 100644
--- a/gcc/ipa-modref.cc
+++ b/gcc/ipa-modref.cc
@@ -1753,8 +1753,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 00000000000..785f4a51761
--- /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 ();
+}
--
2.43.0