From f7df23be90f2f2d73234546a192271007c29d5cc Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 12 Jun 2003 12:53:01 +0000 Subject: [PATCH] fold-const.c (tree_expr_nonnegative_p): Add support for floating point constants, addition and multiplication. * fold-const.c (tree_expr_nonnegative_p): Add support for floating point constants, addition and multiplication. * gcc.dg/builtins-21.c: New test case. From-SVN: r67828 --- gcc/ChangeLog | 5 +++ gcc/fold-const.c | 22 +++++++++++- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/builtins-21.c | 55 ++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/builtins-21.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b738ffb6eec..87d86d7217d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-06-12 Roger Sayle + + * fold-const.c (tree_expr_nonnegative_p): Add support for + floating point constants, addition and multiplication. + 2003-06-12 J"orn Rennecke * sh.md (adddi3_compact, subdi3_compact): Add earlyclobber diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 927b4d7410c..b3271a2c6da 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8014,9 +8014,29 @@ tree_expr_nonnegative_p (t) C[LT]Z_DEFINED_VALUE_AT_ZERO is set, since what we're computing here is a user-visible property. */ return 0; - + case INTEGER_CST: return tree_int_cst_sgn (t) >= 0; + + case REAL_CST: + return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t)); + + case PLUS_EXPR: + return FLOAT_TYPE_P (TREE_TYPE (t)) + && tree_expr_nonnegative_p (TREE_OPERAND (t, 0)) + && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)); + + case MULT_EXPR: + if (FLOAT_TYPE_P (TREE_TYPE (t))) + { + /* x * x for floating point x is always non-negative. */ + if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0)) + return 1; + return tree_expr_nonnegative_p (TREE_OPERAND (t, 0)) + && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)); + } + return 0; + case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index acd4e47aab1..704694ab33c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-06-12 Roger Sayle + + * gcc.dg/builtins-21.c: New test case. + 2003-06-11 Kelley Cook * lib/gcc.exp (gcc_target_compile): Put TOOL_OPTIONS at front of diff --git a/gcc/testsuite/gcc.dg/builtins-21.c b/gcc/testsuite/gcc.dg/builtins-21.c new file mode 100644 index 00000000000..38d0c4f3114 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtins-21.c @@ -0,0 +1,55 @@ +/* Copyright (C) 2003 Free Software Foundation. + + Verify that built-in math function constant folding doesn't + cause any problems for the compiler. + + Written by Roger Sayle, 7th June 2003. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -ffast-math" } */ + +double test1(double x) +{ + return fabs(x*x); +} + +double test2(double x) +{ + return fabs(sqrt(x)+2.0); +} + +double test3(double x) +{ + return fabs(3.0*exp(x)); +} + +float test1f(float x) +{ + return fabsf(x*x); +} + +float test2f(float x) +{ + return fabsf(sqrtf(x)+2.0f); +} + +float test3f(float x) +{ + return fabsf(3.0f*expf(x)); +} + +long double test1l(long double x) +{ + return fabsl(x*x); +} + +long double test2l(long double x) +{ + return fabsl(sqrtl(x)+2.0l); +} + +long double test3l(long double x) +{ + return fabsl(3.0l*expl(x)); +} + -- 2.30.2