re PR tree-optimization/48067 (FMA with no add operand produced by convert_mul_to_fma)
authorRichard Guenther <rguenther@suse.de>
Fri, 11 Mar 2011 16:36:16 +0000 (16:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 11 Mar 2011 16:36:16 +0000 (16:36 +0000)
2011-03-11  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48067
* tree-ssa-math-opts.c (convert_mult_to_fma): Verify the
multiplication result will be only used once on the target
stmt.

* gcc.dg/pr48067.c: New testcase.

From-SVN: r170877

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr48067.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c

index 8a5ca08feeebbe9b335bf596a6bcf7413091fa31..78a6a324ffb09b542bd364048f1cd2d37d32ab71 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-11  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48067
+       * tree-ssa-math-opts.c (convert_mult_to_fma): Verify the
+       multiplication result will be only used once on the target
+       stmt.
+
 2011-03-11  Richard Guenther  <rguenther@suse.de>
 
        * doc/invoke.texi (max-inline-insns-single): Adjust default value.
index 69b6ad51d6339af2c11e06583029ae733fbc60cd..5976bb4fd3405b2cefced65367bc1918429f3764 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-11  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48067
+       * gcc.dg/pr48067.c: New testcase.
+
 2011-03-11  Richard Guenther  <rguenther@suse.de>
 
        PR lto/48073
diff --git a/gcc/testsuite/gcc.dg/pr48067.c b/gcc/testsuite/gcc.dg/pr48067.c
new file mode 100644 (file)
index 0000000..7796909
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math -fno-tree-forwprop -fno-tree-reassoc" } */
+/* { dg-options "-O2 -ffast-math -fno-tree-forwprop -fno-tree-reassoc -mfma4" { target x86_64-*-* i?86-*-* } } */
+
+float
+foo (float x, float cim)
+{
+  float c = x * cim;
+  float d = -c;
+  return c - d;
+}
index ed9b7a9d5467bdc0b69bfc1eef76f7171e4e345b..6e2213ccea206f75e5560e34797899b657ce030d 100644 (file)
@@ -1557,6 +1557,9 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2)
       /* A negate on the multiplication leads to FNMA.  */
       if (use_code == NEGATE_EXPR)
        {
+         ssa_op_iter iter;
+         tree use;
+
          result = gimple_assign_lhs (use_stmt);
 
          /* Make sure the negate statement becomes dead with this
@@ -1565,6 +1568,11 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2)
                               &use_p, &neguse_stmt))
            return false;
 
+         /* Make sure the multiplication isn't also used on that stmt.  */
+         FOR_EACH_SSA_TREE_OPERAND (use, neguse_stmt, iter, SSA_OP_USE)
+           if (use == mul_result)
+             return false;
+
          /* Re-validate.  */
          use_stmt = neguse_stmt;
          if (gimple_bb (use_stmt) != gimple_bb (mul_stmt))