The following avoids ICEing for V2SI -> DImode vec_unpacks_lo.

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

        PR tree-optimization/107896
        * tree-vect-stmts.cc (supportable_widening_operation):
        Handle non-vector mode intermediate mode.
---
 gcc/tree-vect-stmts.cc | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index b35b986889d..5485da58b38 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -12194,9 +12194,8 @@ supportable_widening_operation (vec_info *vinfo,
       if (VECTOR_BOOLEAN_TYPE_P (prev_type))
        intermediate_type
          = vect_halve_mask_nunits (prev_type, intermediate_mode);
-      else
+      else if (VECTOR_MODE_P (intermediate_mode))
        {
-         gcc_assert (VECTOR_MODE_P (intermediate_mode));
          tree intermediate_element_type
            = lang_hooks.types.type_for_mode (GET_MODE_INNER 
(intermediate_mode),
                                              TYPE_UNSIGNED (prev_type));
@@ -12204,6 +12203,10 @@ supportable_widening_operation (vec_info *vinfo,
            = build_vector_type_for_mode (intermediate_element_type,
                                          intermediate_mode);
        }
+      else
+       intermediate_type
+         = lang_hooks.types.type_for_mode (intermediate_mode,
+                                           TYPE_UNSIGNED (prev_type));
 
       if (VECTOR_BOOLEAN_TYPE_P (intermediate_type)
          && VECTOR_BOOLEAN_TYPE_P (prev_type)
-- 
2.35.3

Reply via email to