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 <ja...@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