The x86 add_stmt_hook relies on the passed vectype to determine
the mode and whether it is FP for a scalar operation.  This is
unreliable now for stmts involving patterns and in the future when
there is no vector type passed for scalar operations.

To be least disruptive I've kept using the vector type if it is passed.

Bootstrapped and tested on x86_64-unknown-linux-gnu.

OK?

Thanks
Richard.

        * config/i386/i386.cc (ix86_vector_costs::add_stmt_cost): Use
        the LHS of a scalar stmt to determine mode and whether it is FP.
---
 gcc/config/i386/i386.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index ad7360ec71a..26eefadea64 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -25798,6 +25798,12 @@ ix86_vector_costs::add_stmt_cost (int count, 
vect_cost_for_stmt kind,
       if (scalar_p)
        mode = TYPE_MODE (TREE_TYPE (vectype));
     }
+  else if (scalar_p && stmt_info)
+    if (tree lhs = gimple_get_lhs (stmt_info->stmt))
+      {
+       fp = FLOAT_TYPE_P (TREE_TYPE (lhs));
+       mode = TYPE_MODE (TREE_TYPE (lhs));
+      }
 
   if ((kind == vector_stmt || kind == scalar_stmt)
       && stmt_info
-- 
2.43.0

Reply via email to