aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-06-09 15:05:49 -0700
committerRichard Henderson <rth@gcc.gnu.org>1998-06-09 15:05:49 -0700
commitac1fdb22b8df0622528a2c7ad7d90e1ad16cae67 (patch)
tree9f0f1d2cdf1394505c0c9e20d41471dcd5c8f5d1 /gcc/fold-const.c
parent1c5d60f5019eec17bdad384ebc39721f0037bb25 (diff)
downloadgcc-ac1fdb22b8df0622528a2c7ad7d90e1ad16cae67.zip
gcc-ac1fdb22b8df0622528a2c7ad7d90e1ad16cae67.tar.gz
gcc-ac1fdb22b8df0622528a2c7ad7d90e1ad16cae67.tar.bz2
fold-const.c (fold): Even with otherwise constant trees...
* fold-const.c (fold): Even with otherwise constant trees, look for opportunities to combine integer constants. From-SVN: r20392
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 5daa253..18e8385 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4433,9 +4433,12 @@ fold (expr)
return convert (TREE_TYPE (t), con);
/* If ARG0 is a constant, don't change things around;
- instead keep all the constant computations together. */
+ instead keep all the constant computations together.
+ Notice, however, if we can merge integer constants. */
- if (TREE_CONSTANT (arg0))
+ if (TREE_CONSTANT (arg0)
+ && !(TREE_CODE (con) == INTEGER_CST
+ && TREE_CODE (arg1) == INTEGER_CST))
return t;
/* Otherwise return (CON +- ARG1) - VAR. */
@@ -4450,9 +4453,12 @@ fold (expr)
return convert (TREE_TYPE (t), con);
/* If ARG0 is a constant, don't change things around;
- instead keep all the constant computations together. */
+ instead keep all the constant computations together.
+ Notice, however, if we can merge integer constants. */
- if (TREE_CONSTANT (arg0))
+ if (TREE_CONSTANT (arg0)
+ && !(TREE_CODE (con) == INTEGER_CST
+ && TREE_CODE (arg1) == INTEGER_CST))
return t;
/* Otherwise return VAR +- (ARG1 +- CON). */
@@ -4481,7 +4487,13 @@ fold (expr)
if (split_tree (arg1, code, &var, &con, &varsign))
{
- if (TREE_CONSTANT (arg1))
+ /* If ARG1 is a constant, don't change things around;
+ instead keep all the constant computations together.
+ Notice, however, if we can merge integer constants. */
+
+ if (TREE_CONSTANT (arg1)
+ && !(TREE_CODE (con) == INTEGER_CST
+ && TREE_CODE (arg0) == INTEGER_CST))
return t;
if (varsign == -1)