aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2002-07-20 22:24:58 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2002-07-20 22:24:58 +0000
commit0da65b89f1c0930d104b273a9218fb63226f4cad (patch)
treee37fb51103098113d2493eb7dee473ac4dd1ec99 /gcc
parent68cd2524d653124382c131d4a739c7f33a95c6b1 (diff)
downloadgcc-0da65b89f1c0930d104b273a9218fb63226f4cad.zip
gcc-0da65b89f1c0930d104b273a9218fb63226f4cad.tar.gz
gcc-0da65b89f1c0930d104b273a9218fb63226f4cad.tar.bz2
simplify-rtx.c (simplify_relational_operation): Optimize abs(x) < 0.0 (and abs(x) >= 0.0 when using -ffast-math).
* simplify-rtx.c (simplify_relational_operation): Optimize abs(x) < 0.0 (and abs(x) >= 0.0 when using -ffast-math). * gcc.c-torture/execute/20020720-1.c: New test case. From-SVN: r55614
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/simplify-rtx.c22
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020720-1.c36
4 files changed, 67 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fe31faf..833b857 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-07-20 Roger Sayle <roger@eyesopen.com>
+
+ * simplify-rtx.c (simplify_relational_operation): Optimize
+ abs(x) < 0.0 (and abs(x) >= 0.0 when using -ffast-math).
+
2002-07-20 Michae Matz <matz@suse.de>
* ra-build.c: (remember_web_was_spilled): Use GENERAL_REGS.
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 95a2af0..b98c475 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2075,6 +2075,28 @@ simplify_relational_operation (code, mode, op0, op1)
return const0_rtx;
break;
+ case LT:
+ /* Optimize abs(x) < 0.0. */
+ if (trueop1 == CONST0_RTX (mode))
+ {
+ tem = GET_CODE (trueop0) == FLOAT_EXTEND ? XEXP (trueop0, 0)
+ : trueop0;
+ if (GET_CODE (tem) == ABS)
+ return const0_rtx;
+ }
+ break;
+
+ case GE:
+ /* Optimize abs(x) >= 0.0. */
+ if (trueop1 == CONST0_RTX (mode) && !HONOR_NANS (mode))
+ {
+ tem = GET_CODE (trueop0) == FLOAT_EXTEND ? XEXP (trueop0, 0)
+ : trueop0;
+ if (GET_CODE (tem) == ABS)
+ return const1_rtx;
+ }
+ break;
+
default:
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 91c63ea..5388182 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-07-20 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.c-torture/execute/20020720-1.c: New testcase.
+
2002-07-20 Neil Booth <neil@daikokuya.co.uk>
* gcc.dg/cpp/Wsignprom.c: New tests.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020720-1.c b/gcc/testsuite/gcc.c-torture/execute/20020720-1.c
new file mode 100644
index 0000000..c70bc74
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020720-1.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 2002 Free Software Foundation.
+
+ Ensure that fabs(x) < 0.0 optimization is working.
+
+ Written by Roger Sayle, 20th July 2002. */
+
+extern void abort (void);
+extern double fabs (double);
+extern void link_error (void);
+
+void
+foo (double x)
+{
+ double p, q;
+
+ p = fabs (x);
+ q = 0.0;
+ if (p < q)
+ link_error ();
+}
+
+int
+main()
+{
+ foo (1.0);
+ return 0;
+}
+
+#ifndef __OPTIMIZE__
+void
+link_error ()
+{
+ abort ();
+}
+#endif
+