re PR tree-optimization/55524 (If fnma exists but not fms, convert_mult_to_fma should prefer to former over the latter.)

gcc:
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.

gcc/testsuite:
2013-04-10  Joern Rennecke <joern.rennecke@embecosm.com>

        PR tree-optimization/55524
        * gcc.target/epiphany/fnma-1.c: New test.

From-SVN: r197668
This commit is contained in:
Joern Rennecke 2013-04-10 09:54:25 +00:00 committed by Joern Rennecke
parent 6957a6f6f9
commit ee8a9b7b50
4 changed files with 40 additions and 0 deletions

View File

@ -1,3 +1,11 @@
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

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,9 @@
/* { 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;
}

View File

@ -2570,6 +2570,24 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2)
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;