aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-06-12 12:53:01 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-06-12 12:53:01 +0000
commitf7df23be90f2f2d73234546a192271007c29d5cc (patch)
treebee1e78d630354a7ade37f1018887b2ec4c5cb43 /gcc
parent38b3ef8be6733c9b911cf9fac07d92d22d5b057c (diff)
downloadgcc-f7df23be90f2f2d73234546a192271007c29d5cc.zip
gcc-f7df23be90f2f2d73234546a192271007c29d5cc.tar.gz
gcc-f7df23be90f2f2d73234546a192271007c29d5cc.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c22
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/builtins-21.c55
4 files changed, 85 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b738ffb..87d86d7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-06-12 Roger Sayle <roger@eyesopen.com>
+
+ * fold-const.c (tree_expr_nonnegative_p): Add support for
+ floating point constants, addition and multiplication.
+
2003-06-12 J"orn Rennecke <joern.rennecke@superh.com>
* sh.md (adddi3_compact, subdi3_compact): Add earlyclobber
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 927b4d7..b3271a2 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 acd4e47..704694a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-12 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.dg/builtins-21.c: New test case.
+
2003-06-11 Kelley Cook <kelleycook@wideopenwest.com>
* 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 0000000..38d0c4f
--- /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));
+}
+