diff mbox series

Correctly handle store IFNs in vect_get_vector_types_for_stmt

Message ID 20240902091930.693AF385EC33@sourceware.org
State New
Headers show
Series Correctly handle store IFNs in vect_get_vector_types_for_stmt | expand

Commit Message

Richard Biener Sept. 2, 2024, 9:19 a.m. UTC
Currently vect_get_vector_types_for_stmt only special-cases
IFN_MASK_STORE but there are now very many variants and simply
passing analysis without setting *VECTYPE will ICE duing SLP
discovery (noticed with IFN_SCATTER_STORE).  The following
properly uses internal_store_fn_p.  I also noticed we're
unnecessarily handing those again to determine the scalar type
but there should always be a data reference for them.

Bootstrapped and tested on x86_64-unknown-linux-gnu, I'll wait
for aarch64 CI before checking in.

Richard.

	* tree-vect-stmts.cc (vect_get_vector_types_for_stmt):
	Handle all internal_store_fn_p the same.  Remove special-casing
	for the scalar_type of IFN_MASK_STORE.
---
 gcc/tree-vect-stmts.cc | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 4eac5ebaf91..f22be63e769 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -14880,8 +14880,10 @@  vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info,
   if (gimple_get_lhs (stmt) == NULL_TREE
       /* Allow vector conditionals through here.  */
       && !is_a <gcond *> (stmt)
-      /* MASK_STORE has no lhs, but is ok.  */
-      && !gimple_call_internal_p (stmt, IFN_MASK_STORE))
+      /* MASK_STORE and friends have no lhs, but are ok.  */
+      && !(is_gimple_call (stmt)
+	   && gimple_call_internal_p (stmt)
+	   && internal_store_fn_p (gimple_call_internal_fn (stmt))))
     {
       if (is_a <gcall *> (stmt))
 	{
@@ -14931,8 +14933,6 @@  vect_get_vector_types_for_stmt (vec_info *vinfo, stmt_vec_info stmt_info,
 
       if (data_reference *dr = STMT_VINFO_DATA_REF (stmt_info))
 	scalar_type = TREE_TYPE (DR_REF (dr));
-      else if (gimple_call_internal_p (stmt, IFN_MASK_STORE))
-	scalar_type = TREE_TYPE (gimple_call_arg (stmt, 3));
       else
 	scalar_type = TREE_TYPE (gimple_get_lhs (stmt));