From: Fariborz Jahanian Date: Tue, 30 Mar 2004 20:00:23 +0000 (+0000) Subject: Reassociate multiply expression with an adjacent non-multiply expression. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0af5da7fb02b22c775094c868ea907b69ec7a3c1;p=gcc.git Reassociate multiply expression with an adjacent non-multiply expression. Reviewed by Roger Sayle. From-SVN: r80093 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7500a8c7311..61813c4529e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-29 Fariborz Jahanian + + * fold-const.c (fold): Reassociate multiply expression + with an adjacent non-multiply expression to use + architecture's multiply-add instruction. + 2004-03-30 Zack Weinberg * gengtype.c (create_option): New function. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 7fbbc8ec8b5..9be1ceae023 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6042,6 +6042,36 @@ fold (tree expr) TREE_OPERAND (arg0, 0), build_real (type, c1))); } + /* Convert a + (b*c + d*e) into (a + b*c) + d*e */ + if (flag_unsafe_math_optimizations + && TREE_CODE (arg1) == PLUS_EXPR + && TREE_CODE (arg0) != MULT_EXPR) + { + tree tree10 = TREE_OPERAND (arg1, 0); + tree tree11 = TREE_OPERAND (arg1, 1); + if (TREE_CODE (tree11) == MULT_EXPR + && TREE_CODE (tree10) == MULT_EXPR) + { + tree tree0; + tree0 = fold (build (PLUS_EXPR, type, arg0, tree10)); + return fold (build (PLUS_EXPR, type, tree0, tree11)); + } + } + /* Convert (b*c + d*e) + a into b*c + (d*e +a) */ + if (flag_unsafe_math_optimizations + && TREE_CODE (arg0) == PLUS_EXPR + && TREE_CODE (arg1) != MULT_EXPR) + { + tree tree00 = TREE_OPERAND (arg0, 0); + tree tree01 = TREE_OPERAND (arg0, 1); + if (TREE_CODE (tree01) == MULT_EXPR + && TREE_CODE (tree00) == MULT_EXPR) + { + tree tree0; + tree0 = fold (build (PLUS_EXPR, type, tree01, arg1)); + return fold (build (PLUS_EXPR, type, tree00, tree0)); + } + } } bit_rotate: