The following adds special handling to OMP SIMD vector call costs
which were not costed at all and for which a single simple vector
stmt isn't appropriate. PR125174 shows that even when AVX imposes
more overhead (from also slightly bogus costing) than SSE, when
there's two OMP SIMD calls involved doing less of those should trump
that. We achieve that by giving a call that is vectorized as call
a higher cost, currently hard coded to 10 times a FMA operation
of the corresponding mode.
v2 replaces the explicit list of known functions with a check
on available SIMD clones (all .MASK_CALL are of this class,
guaranteed by if-conversion).
Bootstrapped and tested on x86_64-unknown-linux-gnu.
OK?
Thanks,
Richard.
PR target/125174
* config/i386/i386.cc (ix86_vector_costs::add_stmt_cost):
Cost calls as 10 times FMA.
---
gcc/config/i386/i386.cc | 40 ++++++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 14 deletions(-)
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index e73c2d7f7d0..9aecd51119f 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -26591,20 +26591,32 @@ ix86_vector_costs::add_stmt_cost (int count,
vect_cost_for_stmt kind,
if ((kind == vector_stmt || kind == scalar_stmt)
&& stmt_info
&& stmt_info->stmt
- && (cfn = gimple_call_combined_fn (stmt_info->stmt)) != CFN_LAST)
- switch (cfn)
- {
- case CFN_FMA:
- stmt_cost = ix86_vec_cost (mode,
- mode == SFmode ? ix86_cost->fmass
- : ix86_cost->fmasd);
- break;
- case CFN_MULH:
- stmt_cost = ix86_multiplication_cost (ix86_cost, mode);
- break;
- default:
- break;
- }
+ && is_gimple_call (stmt_info->stmt))
+ {
+ tree fndecl = gimple_call_fndecl (stmt_info->stmt);
+ cgraph_node *node;
+ if ((fndecl
+ && (node = cgraph_node::get (fndecl))
+ && node->simd_clones)
+ || gimple_call_internal_p (stmt_info->stmt, IFN_MASK_CALL))
+ stmt_cost = 10 * ix86_vec_cost (mode,
+ mode == SFmode ? ix86_cost->fmass
+ : ix86_cost->fmasd);
+ else if ((cfn = gimple_call_combined_fn (stmt_info->stmt)) != CFN_LAST)
+ switch (cfn)
+ {
+ case CFN_FMA:
+ stmt_cost = ix86_vec_cost (mode,
+ mode == SFmode ? ix86_cost->fmass
+ : ix86_cost->fmasd);
+ break;
+ case CFN_MULH:
+ stmt_cost = ix86_multiplication_cost (ix86_cost, mode);
+ break;
+ default:
+ break;
+ }
+ }
if (kind == vec_promote_demote)
{
--
2.51.0