aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2004-11-02 22:31:20 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2004-11-02 21:31:20 +0000
commita63c0d13291b93a42e927d0356b2d9854c654337 (patch)
treee48aabceb4bd08808fc31d0bf20e2e5d8949bada
parentde253ca48a960dd0d3ce5271c080afa3db69d7c0 (diff)
downloadgcc-a63c0d13291b93a42e927d0356b2d9854c654337.zip
gcc-a63c0d13291b93a42e927d0356b2d9854c654337.tar.gz
gcc-a63c0d13291b93a42e927d0356b2d9854c654337.tar.bz2
fold-const.c (fold): Reassociate also (x - mult) + mult and (mult - x) + mult.
* fold-const.c (fold): Reassociate also (x - mult) + mult and (mult - x) + mult. Cast operands of expression after applying distributive law to the correct types. Apply distributive law to a * c - b * c for all non-float types. From-SVN: r90000
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c26
2 files changed, 23 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 51cf8269..f1234ba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-02 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * fold-const.c (fold): Reassociate also (x - mult) + mult and
+ (mult - x) + mult. Cast operands of expression after applying
+ distributive law to the correct types. Apply distributive law
+ to a * c - b * c for all non-float types.
+
2004-11-02 Geoffrey Keating <geoffk@apple.com>
* configure.ac: Don't clear STMP_FIXINC or STMP_FIXPROTO just
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 00892f4..01054d1 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -6586,17 +6586,21 @@ fold (tree expr)
/* Reassociate (plus (plus (mult) (foo)) (mult)) as
(plus (plus (mult) (mult)) (foo)) so that we can
take advantage of the factoring cases below. */
- if ((TREE_CODE (arg0) == PLUS_EXPR
+ if (((TREE_CODE (arg0) == PLUS_EXPR
+ || TREE_CODE (arg0) == MINUS_EXPR)
&& TREE_CODE (arg1) == MULT_EXPR)
- || (TREE_CODE (arg1) == PLUS_EXPR
+ || ((TREE_CODE (arg1) == PLUS_EXPR
+ || TREE_CODE (arg1) == MINUS_EXPR)
&& TREE_CODE (arg0) == MULT_EXPR))
{
tree parg0, parg1, parg, marg;
+ enum tree_code pcode;
- if (TREE_CODE (arg0) == PLUS_EXPR)
+ if (TREE_CODE (arg1) == MULT_EXPR)
parg = arg0, marg = arg1;
else
parg = arg1, marg = arg0;
+ pcode = TREE_CODE (parg);
parg0 = TREE_OPERAND (parg, 0);
parg1 = TREE_OPERAND (parg, 1);
STRIP_NOPS (parg0);
@@ -6604,7 +6608,7 @@ fold (tree expr)
if (TREE_CODE (parg0) == MULT_EXPR
&& TREE_CODE (parg1) != MULT_EXPR)
- return fold (build2 (PLUS_EXPR, type,
+ return fold (build2 (pcode, type,
fold (build2 (PLUS_EXPR, type,
fold_convert (type, parg0),
fold_convert (type, marg))),
@@ -6612,10 +6616,11 @@ fold (tree expr)
if (TREE_CODE (parg0) != MULT_EXPR
&& TREE_CODE (parg1) == MULT_EXPR)
return fold (build2 (PLUS_EXPR, type,
- fold (build2 (PLUS_EXPR, type,
- fold_convert (type, parg1),
- fold_convert (type, marg))),
- fold_convert (type, parg0)));
+ fold_convert (type, parg0),
+ fold (build2 (pcode, type,
+ fold_convert (type, marg),
+ fold_convert (type,
+ parg1)))));
}
if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
@@ -6677,7 +6682,8 @@ fold (tree expr)
if (same)
return fold (build2 (MULT_EXPR, type,
fold (build2 (PLUS_EXPR, type,
- alt0, alt1)),
+ fold_convert (type, alt0),
+ fold_convert (type, alt1))),
same));
}
@@ -7084,7 +7090,7 @@ fold (tree expr)
if (TREE_CODE (arg0) == MULT_EXPR
&& TREE_CODE (arg1) == MULT_EXPR
- && (INTEGRAL_TYPE_P (type) || flag_unsafe_math_optimizations))
+ && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
{
/* (A * C) - (B * C) -> (A-B) * C. */
if (operand_equal_p (TREE_OPERAND (arg0, 1),