diff options
author | Roger Sayle <roger@eyesopen.com> | 2002-07-20 22:24:58 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2002-07-20 22:24:58 +0000 |
commit | 0da65b89f1c0930d104b273a9218fb63226f4cad (patch) | |
tree | e37fb51103098113d2493eb7dee473ac4dd1ec99 /gcc | |
parent | 68cd2524d653124382c131d4a739c7f33a95c6b1 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20020720-1.c | 36 |
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 + |