https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69956

Ilya Enkovich <ienkovich at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ienkovich at gcc dot gnu.org

--- Comment #3 from Ilya Enkovich <ienkovich at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #2)
> We have VEC_UNPACK_HI_EXPR of 'int' type on { 0, 0, ... }
> 
> vect_patt_45.15_139 = [vec_unpack_hi_expr] mask__39.12_136;
> 
> 
> _139 is of type int.

For multi-step conversion we get a type by mode:

intermediate_mode = insn_data[icode1].operand[0].mode;         
intermediate_type                                              
  = lang_hooks.types.type_for_mode (intermediate_mode,         
                                    TYPE_UNSIGNED (prev_type));

We can never get boolean vector like this.  We may introduce a target hook to
get boolean vector by mode or just compute it from the previous vectype.  This
patch fixes ICE for the testcase:

diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 9678d7c..1434d98 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9000,9 +9000,19 @@ supportable_widening_operation (enum tree_code code,
gimple *stmt,
   for (i = 0; i < MAX_INTERM_CVT_STEPS; i++)
     {
       intermediate_mode = insn_data[icode1].operand[0].mode;
-      intermediate_type
-       = lang_hooks.types.type_for_mode (intermediate_mode,
-                                         TYPE_UNSIGNED (prev_type));
+      if (VECTOR_BOOLEAN_TYPE_P (prev_type))
+       {
+         intermediate_type
+           = build_truth_vector_type (TYPE_VECTOR_SUBPARTS (prev_type) / 2,
+                                      current_vector_size);
+         if (intermediate_mode != TYPE_MODE (intermediate_type)
+           return false;
+       }
+      else
+       intermediate_type
+         = lang_hooks.types.type_for_mode (intermediate_mode,
+                                           TYPE_UNSIGNED (prev_type));
+
       optab3 = optab_for_tree_code (c1, intermediate_type, optab_default);
       optab4 = optab_for_tree_code (c2, intermediate_type, optab_default);



Similar change is is required for narrowing case.

Reply via email to