This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Committed] PR middle-end/23470: pow(x,2.0) is non-negative

On 11/1/06, Roger Sayle <> wrote:

The following patch resolves PR middle-end/23470 by teaching fold-const.c's tree_expr_nonnegative_p that pow(x,y) and powi(x,y) are nonnegative if either x is non-negative or y is an even number. Reading though my documentation this appears correct for C99 even in the presence of infinities and signed zeros.

The issue in the PR is with -ffast-math, the middle-end internally
handles x*x as __builtin_pow(x,2.0) when x has a floating point type,
and although fold-const.c can determine that x*x is non-negative for
floating point values, it wasn't as clever about __builtin_pow.  With
this change, we can now even optimize "if (x*x*x*x*x*x < 0.0)" when
using -ffast-math.

What do you think of a POW_EXPR tree code? We could allow base and exponent to differ in types and impose fortran semantics on it with respect to expression contracting and rounding. Folding and expanding would simplify.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]