diff options
author | Roger Sayle <roger@eyesopen.com> | 2002-06-01 16:56:08 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2002-06-01 16:56:08 +0000 |
commit | 378393da613d7c182ce3370696ec47a5a5cb2aef (patch) | |
tree | c7cb5d93af1f6099cec88dc9bb98ff85b1058671 /gcc/tree.c | |
parent | 01c58f2670a5f7858b8762e06cab0a68b98a684f (diff) | |
download | gcc-378393da613d7c182ce3370696ec47a5a5cb2aef.zip gcc-378393da613d7c182ce3370696ec47a5a5cb2aef.tar.gz gcc-378393da613d7c182ce3370696ec47a5a5cb2aef.tar.bz2 |
tree.c (real_minus_onep): New function to test for -1.0.
* tree.c (real_minus_onep): New function to test for -1.0.
* fold-const.c (fold) [MULT_EXPR]: Optimize -1.0*x into -x.
* gcc.dg/fnegate-1.c: New test case.
From-SVN: r54149
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -892,6 +892,22 @@ real_twop (expr) && real_zerop (TREE_IMAGPART (expr)))); } +/* Return 1 if EXPR is the real constant minus one. */ + +int +real_minus_onep (expr) + tree expr; +{ + STRIP_NOPS (expr); + + return ((TREE_CODE (expr) == REAL_CST + && ! TREE_CONSTANT_OVERFLOW (expr) + && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconstm1)) + || (TREE_CODE (expr) == COMPLEX_CST + && real_minus_onep (TREE_REALPART (expr)) + && real_zerop (TREE_IMAGPART (expr)))); +} + /* Nonzero if EXP is a constant or a cast of a constant. */ int |