Hi!

On the following testcase we replace a PLUS_EXPR (which is considered
throwing with -fnon-call-exceptions when it has floating point arguments
and FP exceptions or sNaNs are enabled) with a FMA_EXPR; I believe it
can throw the same, but stmt_could_throw_1_p doesn't think so (as it is
not unary/binary/comparison).  While we could tweak the widen_mul patch
to deal with dropping EH from gsi_replace and cleaning up cfg etc., I
believe the right fix is to fix stmt_could_throw_1_p.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-02-24  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/79396
        * tree-eh.c (stmt_could_throw_1_p): Handle FMA_EXPR like tcc_binary
        or tcc_unary.

        * g++.dg/opt/pr79396.C: New test.

--- gcc/tree-eh.c.jj    2017-02-06 13:32:13.000000000 +0100
+++ gcc/tree-eh.c       2017-02-24 19:14:04.964854279 +0100
@@ -2738,7 +2738,8 @@ stmt_could_throw_1_p (gimple *stmt)
 
   if (TREE_CODE_CLASS (code) == tcc_comparison
       || TREE_CODE_CLASS (code) == tcc_unary
-      || TREE_CODE_CLASS (code) == tcc_binary)
+      || TREE_CODE_CLASS (code) == tcc_binary
+      || code == FMA_EXPR)
     {
       if (is_gimple_assign (stmt)
          && TREE_CODE_CLASS (code) == tcc_comparison)
--- gcc/testsuite/g++.dg/opt/pr79396.C.jj       2017-02-24 19:22:18.499312974 
+0100
+++ gcc/testsuite/g++.dg/opt/pr79396.C  2017-02-24 19:21:38.000000000 +0100
@@ -0,0 +1,13 @@
+// PR middle-end/79396
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions -O2" }
+// { dg-additional-options "-mfma" { target i?86-*-* x86_64-*-* } }
+
+struct A { A (); ~A (); };
+
+float
+foo (float x)
+{
+  A a;
+  return __builtin_pow (x, 2) + 2;
+}

        Jakub

Reply via email to