aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-03-20 20:49:22 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1993-03-20 20:49:22 -0500
commitca86a57ae73f553818ebadb894d422930648a6e1 (patch)
treeaa9dd7621a884155f004f5ce7877ae921669a0f4 /gcc
parent404f986e04ee55d0d944c85f02e83ea5a2519a19 (diff)
downloadgcc-ca86a57ae73f553818ebadb894d422930648a6e1.zip
gcc-ca86a57ae73f553818ebadb894d422930648a6e1.tar.gz
gcc-ca86a57ae73f553818ebadb894d422930648a6e1.tar.bz2
(fold, case PLUS_EXPR): Don't associate apart a constant operand.
From-SVN: r3807
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-const.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index ec04f44..97cb123 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3424,6 +3424,12 @@ fold (expr)
if (code == PLUS_EXPR && operand_equal_p (var, arg1, 0))
return convert (TREE_TYPE (t), con);
+ /* If ARG0 is a constant, don't change things around;
+ instead keep all the constant computations together. */
+
+ if (TREE_CONSTANT (arg0))
+ return t;
+
/* Otherwise return (CON +- ARG1) - VAR. */
TREE_SET_CODE (t, MINUS_EXPR);
TREE_OPERAND (t, 1) = var;
@@ -3437,6 +3443,12 @@ fold (expr)
if (code == MINUS_EXPR && operand_equal_p (var, arg1, 0))
return convert (TREE_TYPE (t), con);
+ /* If ARG0 is a constant, don't change things around;
+ instead keep all the constant computations together. */
+
+ if (TREE_CONSTANT (arg0))
+ return t;
+
/* Otherwise return VAR +- (ARG1 +- CON). */
TREE_OPERAND (t, 1) = tem
= fold (build (code, TREE_TYPE (t), arg1, con));
@@ -3464,9 +3476,6 @@ fold (expr)
if (split_tree (arg1, code, &var, &con, &varsign))
{
/* EXPR is ARG0 +- (CON +- VAR). */
- if (varsign == -1)
- TREE_SET_CODE (t,
- (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
if (TREE_CODE (t) == MINUS_EXPR
&& operand_equal_p (var, arg0, 0))
{
@@ -3476,6 +3485,11 @@ fold (expr)
return fold (build1 (NEGATE_EXPR, TREE_TYPE (t),
convert (TREE_TYPE (t), con)));
}
+ if (TREE_CONSTANT (arg1))
+ return t;
+ if (varsign == -1)
+ TREE_SET_CODE (t,
+ (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
TREE_OPERAND (t, 0)
= fold (build (code, TREE_TYPE (t), arg0, con));
TREE_OPERAND (t, 1) = var;