diff mbox

FMA_EXPR can cause -fnon-call-exceptions with floating point args (PR middle-end/79396)

Message ID 20170224205625.GP1849@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Feb. 24, 2017, 8:56 p.m. UTC
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  <jakub@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.


	Jakub

Comments

Richard Biener Feb. 25, 2017, 7:42 a.m. UTC | #1
On February 24, 2017 9:56:25 PM GMT+01:00, Jakub Jelinek <jakub@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  <jakub@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
diff mbox

Patch

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