Commit a63c0d13 by Zdenek Dvorak Committed by Zdenek Dvorak

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
parent de253ca4
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> 2004-11-02 Geoffrey Keating <geoffk@apple.com>
* configure.ac: Don't clear STMP_FIXINC or STMP_FIXPROTO just * configure.ac: Don't clear STMP_FIXINC or STMP_FIXPROTO just
......
...@@ -6586,17 +6586,21 @@ fold (tree expr) ...@@ -6586,17 +6586,21 @@ fold (tree expr)
/* Reassociate (plus (plus (mult) (foo)) (mult)) as /* Reassociate (plus (plus (mult) (foo)) (mult)) as
(plus (plus (mult) (mult)) (foo)) so that we can (plus (plus (mult) (mult)) (foo)) so that we can
take advantage of the factoring cases below. */ 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) == MULT_EXPR)
|| (TREE_CODE (arg1) == PLUS_EXPR || ((TREE_CODE (arg1) == PLUS_EXPR
|| TREE_CODE (arg1) == MINUS_EXPR)
&& TREE_CODE (arg0) == MULT_EXPR)) && TREE_CODE (arg0) == MULT_EXPR))
{ {
tree parg0, parg1, parg, marg; 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; parg = arg0, marg = arg1;
else else
parg = arg1, marg = arg0; parg = arg1, marg = arg0;
pcode = TREE_CODE (parg);
parg0 = TREE_OPERAND (parg, 0); parg0 = TREE_OPERAND (parg, 0);
parg1 = TREE_OPERAND (parg, 1); parg1 = TREE_OPERAND (parg, 1);
STRIP_NOPS (parg0); STRIP_NOPS (parg0);
...@@ -6604,7 +6608,7 @@ fold (tree expr) ...@@ -6604,7 +6608,7 @@ fold (tree expr)
if (TREE_CODE (parg0) == MULT_EXPR if (TREE_CODE (parg0) == MULT_EXPR
&& TREE_CODE (parg1) != MULT_EXPR) && TREE_CODE (parg1) != MULT_EXPR)
return fold (build2 (PLUS_EXPR, type, return fold (build2 (pcode, type,
fold (build2 (PLUS_EXPR, type, fold (build2 (PLUS_EXPR, type,
fold_convert (type, parg0), fold_convert (type, parg0),
fold_convert (type, marg))), fold_convert (type, marg))),
...@@ -6612,10 +6616,11 @@ fold (tree expr) ...@@ -6612,10 +6616,11 @@ fold (tree expr)
if (TREE_CODE (parg0) != MULT_EXPR if (TREE_CODE (parg0) != MULT_EXPR
&& TREE_CODE (parg1) == MULT_EXPR) && TREE_CODE (parg1) == MULT_EXPR)
return fold (build2 (PLUS_EXPR, type, return fold (build2 (PLUS_EXPR, type,
fold (build2 (PLUS_EXPR, type, fold_convert (type, parg0),
fold_convert (type, parg1), fold (build2 (pcode, type,
fold_convert (type, marg))), fold_convert (type, marg),
fold_convert (type, parg0))); fold_convert (type,
parg1)))));
} }
if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR) if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
...@@ -6677,7 +6682,8 @@ fold (tree expr) ...@@ -6677,7 +6682,8 @@ fold (tree expr)
if (same) if (same)
return fold (build2 (MULT_EXPR, type, return fold (build2 (MULT_EXPR, type,
fold (build2 (PLUS_EXPR, type, fold (build2 (PLUS_EXPR, type,
alt0, alt1)), fold_convert (type, alt0),
fold_convert (type, alt1))),
same)); same));
} }
...@@ -7084,7 +7090,7 @@ fold (tree expr) ...@@ -7084,7 +7090,7 @@ fold (tree expr)
if (TREE_CODE (arg0) == MULT_EXPR if (TREE_CODE (arg0) == MULT_EXPR
&& TREE_CODE (arg1) == 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. */ /* (A * C) - (B * C) -> (A-B) * C. */
if (operand_equal_p (TREE_OPERAND (arg0, 1), if (operand_equal_p (TREE_OPERAND (arg0, 1),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment