On February 24, 2017 9:56:25 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> 
wrote:
>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?

OK.  Can you make sure this is then consistent with the other throw predicates?.

Richard

>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