aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-08-26 06:04:35 +0000
committerRichard Stallman <rms@gnu.org>1992-08-26 06:04:35 +0000
commit1b81aa149386d6b086c0a55837e9c34331f3bb27 (patch)
tree8188c7a2288304fd39d66ef4d35e4eaedf28d981 /gcc/fold-const.c
parent3bf40d18826c0f6cfad45d8d3a5e604c854b8d34 (diff)
downloadgcc-1b81aa149386d6b086c0a55837e9c34331f3bb27.zip
gcc-1b81aa149386d6b086c0a55837e9c34331f3bb27.tar.gz
gcc-1b81aa149386d6b086c0a55837e9c34331f3bb27.tar.bz2
(fold): Avoid the normal STRIP_NOPS on arg of NOP_EXPR.
From-SVN: r1959
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 44933bf..e23683e 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -2849,7 +2849,27 @@ fold (expr)
}
kind = TREE_CODE_CLASS (code);
- if (kind == 'e' || kind == '<' || kind == '1' || kind == '2' || kind == 'r')
+ if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
+ {
+ /* Special case for conversion ops that can have fixed point args. */
+ arg0 = TREE_OPERAND (t, 0);
+
+ /* Don't use STRIP_NOPS, because signedness of argument type matters. */
+ if (arg0 != 0)
+ STRIP_TYPE_NOPS (arg0);
+
+ if (arg0 != 0 && TREE_CODE (arg0) != INTEGER_CST
+#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
+ && TREE_CODE (arg0) != REAL_CST
+#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
+ )
+ /* Note that TREE_CONSTANT isn't enough:
+ static var addresses are constant but we can't
+ do arithmetic on them. */
+ wins = 0;
+ }
+ else if (kind == 'e' || kind == '<'
+ || kind == '1' || kind == '2' || kind == 'r')
{
register int len = tree_code_length[(int) code];
register int i;