Message ID | 20151231092919.GY18720@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
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
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
--- 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); +}