aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2002-06-01 16:56:08 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2002-06-01 16:56:08 +0000
commit378393da613d7c182ce3370696ec47a5a5cb2aef (patch)
treec7cb5d93af1f6099cec88dc9bb98ff85b1058671 /gcc/tree.c
parent01c58f2670a5f7858b8762e06cab0a68b98a684f (diff)
downloadgcc-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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 15f156a..04ae6ce 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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