+2013-04-10 Joern Rennecke <joern.rennecke@embecosm.com>
+
+ PR tree-optimization/55524
+ * tree-ssa-math-opts.c
+ (convert_mult_to_fma): Don't use an fms construct
+ when we don't have an fms operation, but fnma, and it looks
+ likely that we'll be able to use the latter.
+
2013-04-10 Zhouyi Zhou <yizhouzhou@ict.ac.cn>
* cif-code.def (OVERWRITABLE): Correct the comment for overwritable
+2013-04-10 Joern Rennecke <joern.rennecke@embecosm.com>
+
+ PR tree-optimization/55524
+ * gcc.target/epiphany/fnma-1.c: New test.
+
2013-04-10 Zhouyi Zhou <yizhouzhou@ict.ac.cn>
* gcc.dg/tree-ssa/inline-11.c: New test
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-times "fmsub\[ \ta-zA-Z0-9\]*," 1 } } */
+
+float
+f (float ar, float ai, float br, float bi)
+{
+ return ar * br - ai * bi;
+}
return false;
}
+ /* If the subtrahend (gimple_assign_rhs2 (use_stmt)) is computed
+ by a MULT_EXPR that we'll visit later, we might be able to
+ get a more profitable match with fnma.
+ OTOH, if we don't, a negate / fma pair has likely lower latency
+ that a mult / subtract pair. */
+ if (use_code == MINUS_EXPR && !negate_p
+ && gimple_assign_rhs1 (use_stmt) == result
+ && optab_handler (fms_optab, TYPE_MODE (type)) == CODE_FOR_nothing
+ && optab_handler (fnma_optab, TYPE_MODE (type)) != CODE_FOR_nothing)
+ {
+ tree rhs2 = gimple_assign_rhs2 (use_stmt);
+ gimple stmt2 = SSA_NAME_DEF_STMT (rhs2);
+
+ if (has_single_use (rhs2)
+ && gimple_assign_rhs_code (stmt2) == MULT_EXPR)
+ return false;
+ }
+
/* We can't handle a * b + a * b. */
if (gimple_assign_rhs1 (use_stmt) == gimple_assign_rhs2 (use_stmt))
return false;