This removes the ability to follow statements that can throw internally.
This was suggested in bug report as a way to solve the issue here.
The overhead is not that high since without non-call exceptions turned
on, there is an early exit for non-calls.

        PR tree-optimization/119903

gcc/ChangeLog:

        * gimple-match-head.cc (get_def): Reject statements that can throw
        internally.

gcc/testsuite/ChangeLog:

        * g++.dg/tree-ssa/pr119903-1.C: New test.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
 gcc/gimple-match-head.cc                   |  5 ++++-
 gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C | 24 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C

diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc
index 6b3c5febbea..62ff8e57fbb 100644
--- a/gcc/gimple-match-head.cc
+++ b/gcc/gimple-match-head.cc
@@ -63,7 +63,10 @@ get_def (tree (*valueize)(tree), tree name)
 {
   if (valueize && ! valueize (name))
     return NULL;
-  return SSA_NAME_DEF_STMT (name);
+  gimple *t = SSA_NAME_DEF_STMT (name);
+  if (stmt_can_throw_internal (cfun, t))
+    return nullptr;
+  return t;
 }
 
 /* Routine to determine if the types T1 and T2 are effectively
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C 
b/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
new file mode 100644
index 00000000000..605f989a2eb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -fnon-call-exceptions -ftrapping-math 
-fdump-tree-optimized-eh" }
+
+// PR tree-optimization/119903
+// match and simplify would cause the internal throwable fp comparison
+// to become only external throwable and lose the landing pad.
+
+int f() noexcept;
+int g() noexcept;
+
+int m(double a)
+{
+  try {
+    if (a < 1.0)
+      return f();
+    return g();
+  }catch(...)
+  {
+        return -1;
+  }
+}
+
+// Make sure There is a landing pad for the non-call exception from the 
comparison.
+// { dg-final { scan-tree-dump "LP " "optimized" } }
-- 
2.43.0

Reply via email to