diff mbox

Fix PR61441 introduced regression (PR tree-optimization/69070)

Message ID 20151231092919.GY18720@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 31, 2015, 9:29 a.m. UTC
Hi!

The PR61441 change added REAL_VALUE_ISSIGNALING_NAN checks for both
operands, but only arg1 is guaranteed to be a REAL_CST at this point.
If arg0 is not a REAL_CST, I think we can allow all the opts the function
does, as all transformations replace the pow with some other expression
that uses the argument some way (sqrt, cbrt, cbrt of sqrt, multiplication by
itself, ...), so sNaN exteptions should be preserved.

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

2015-12-31  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/69070
	* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Only test
	REAL_VALUE_ISSIGNALING_NAN on arg0 if arg0 is a REAL_CST.

	* gcc.dg/pr69070.c: New test.


	Jakub

Comments

Richard Biener Jan. 1, 2016, 10:39 a.m. UTC | #1
On December 31, 2015 10:29:19 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>The PR61441 change added REAL_VALUE_ISSIGNALING_NAN checks for both
>operands, but only arg1 is guaranteed to be a REAL_CST at this point.
>If arg0 is not a REAL_CST, I think we can allow all the opts the
>function
>does, as all transformations replace the pow with some other expression
>that uses the argument some way (sqrt, cbrt, cbrt of sqrt,
>multiplication by
>itself, ...), so sNaN exteptions should be preserved.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

>2015-12-31  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/69070
>	* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Only test
>	REAL_VALUE_ISSIGNALING_NAN on arg0 if arg0 is a REAL_CST.
>
>	* gcc.dg/pr69070.c: New test.
>
>--- gcc/tree-ssa-math-opts.c.jj	2015-12-22 19:18:51.000000000 +0100
>+++ gcc/tree-ssa-math-opts.c	2015-12-29 14:15:49.587126962 +0100
>@@ -1538,7 +1538,8 @@ gimple_expand_builtin_pow (gimple_stmt_i
>   /* Don't perform the operation if flag_signaling_nans is on
>      and the operand is a signaling NaN.  */
>   if (HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
>-      && (REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0))
>+      && ((TREE_CODE (arg0) == REAL_CST
>+	   && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0)))
> 	  || REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg1))))
>     return NULL_TREE;
> 
>--- gcc/testsuite/gcc.dg/pr69070.c.jj	2015-12-29 14:22:38.313434143
>+0100
>+++ gcc/testsuite/gcc.dg/pr69070.c	2015-12-29 14:22:24.000000000 +0100
>@@ -0,0 +1,9 @@
>+/* PR tree-optimization/69070 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fsignaling-nans" } */
>+
>+double
>+foo (double d)
>+{
>+  return __builtin_pow (d, 2);
>+}
>
>	Jakub
Jeff Law Jan. 2, 2016, 7:44 a.m. UTC | #2
On 12/31/2015 02:29 AM, Jakub Jelinek wrote:
> Hi!
>
> The PR61441 change added REAL_VALUE_ISSIGNALING_NAN checks for both
> operands, but only arg1 is guaranteed to be a REAL_CST at this point.
> If arg0 is not a REAL_CST, I think we can allow all the opts the function
> does, as all transformations replace the pow with some other expression
> that uses the argument some way (sqrt, cbrt, cbrt of sqrt, multiplication by
> itself, ...), so sNaN exteptions should be preserved.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2015-12-31  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR tree-optimization/69070
> 	* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Only test
> 	REAL_VALUE_ISSIGNALING_NAN on arg0 if arg0 is a REAL_CST.
>
> 	* gcc.dg/pr69070.c: New test.
OK.
jeff
diff mbox

Patch

--- gcc/tree-ssa-math-opts.c.jj	2015-12-22 19:18:51.000000000 +0100
+++ gcc/tree-ssa-math-opts.c	2015-12-29 14:15:49.587126962 +0100
@@ -1538,7 +1538,8 @@  gimple_expand_builtin_pow (gimple_stmt_i
   /* Don't perform the operation if flag_signaling_nans is on
      and the operand is a signaling NaN.  */
   if (HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
-      && (REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0))
+      && ((TREE_CODE (arg0) == REAL_CST
+	   && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0)))
 	  || REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg1))))
     return NULL_TREE;
 
--- gcc/testsuite/gcc.dg/pr69070.c.jj	2015-12-29 14:22:38.313434143 +0100
+++ gcc/testsuite/gcc.dg/pr69070.c	2015-12-29 14:22:24.000000000 +0100
@@ -0,0 +1,9 @@ 
+/* PR tree-optimization/69070 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fsignaling-nans" } */
+
+double
+foo (double d)
+{
+  return __builtin_pow (d, 2);
+}