OSDN Git Service

Reassociate multiply expression with an adjacent non-multiply expression.
authorfjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Mar 2004 20:00:23 +0000 (20:00 +0000)
committerfjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Mar 2004 20:00:23 +0000 (20:00 +0000)
Reviewed by Roger Sayle.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80093 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c

index 7500a8c..61813c4 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-29  Fariborz Jahanian <fjahanian@apple.com>
+
+        * 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  <zack@codesourcery.com>
 
        * gengtype.c (create_option): New function.
index 7fbbc8e..9be1cea 100644 (file)
@@ -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: