On Fri, Nov 15, 2019 at 1:55 PM Richard Sandiford
<[email protected]> wrote:
>
> r278235 broke conversions of vector/scalar shifts into vector/vector
> shifts on targets that only provide the latter.  We need to record
> whether a conversion is required in that case too.
>
> Also, the old useless_type_conversion_p condition seemed unnecessarily
> strong, since the shift amount can have a different signedness from
> the shifted value and its vector type is never assumed to be identical
> to vectype.  The patch therefore uses tree_nop_conversion_p instead.
>
> Tested on aarch64-linux-gnu and spot-checked on powerpc64-linux-gnu.
> OK to install?

OK.

Richard.

> Richard
>
>
> 2019-11-15  Richard Sandiford  <[email protected]>
>
> gcc/
>         PR tree-optimization/92515
>         * tree-vect-stmts.c (vectorizable_shift): Record incompatible op1
>         types when converting a vector/scalar shift into a vector/vector one,
>         using tree_nop_conversion_p instead of useless_type_conversion_p.
>         Move the conversion code to the transform block.
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2019-11-14 15:31:21.616704454 +0000
> +++ gcc/tree-vect-stmts.c       2019-11-15 12:54:19.281608678 +0000
> @@ -5750,21 +5750,9 @@ vectorizable_shift (stmt_vec_info stmt_i
>                   the rhs being int, instead of the same type as the lhs,
>                   so make sure the scalar is the right type if we are
>                  dealing with vectors of long long/long/short/char.  */
> -              if (dt[1] == vect_constant_def)
> -               {
> -                 if (!slp_node)
> -                   op1 = fold_convert (TREE_TYPE (vectype), op1);
> -               }
> -             else if (!useless_type_conversion_p (TREE_TYPE (vectype),
> -                                                  TREE_TYPE (op1)))
> -               {
> -                 if (vec_stmt && !slp_node)
> -                   {
> -                     op1 = fold_convert (TREE_TYPE (vectype), op1);
> -                     op1 = vect_init_vector (stmt_info, op1,
> -                                             TREE_TYPE (vectype), NULL);
> -                   }
> -               }
> +             incompatible_op1_vectype_p
> +               = !tree_nop_conversion_p (TREE_TYPE (vectype),
> +                                         TREE_TYPE (op1));
>              }
>          }
>      }
> @@ -5819,6 +5807,14 @@ vectorizable_shift (stmt_vec_info stmt_i
>      dump_printf_loc (MSG_NOTE, vect_location,
>                       "transform binary/unary operation.\n");
>
> +  if (incompatible_op1_vectype_p && !slp_node)
> +    {
> +      op1 = fold_convert (TREE_TYPE (vectype), op1);
> +      if (dt[1] != vect_constant_def)
> +       op1 = vect_init_vector (stmt_info, op1,
> +                               TREE_TYPE (vectype), NULL);
> +    }
> +
>    /* Handle def.  */
>    vec_dest = vect_create_destination_var (scalar_dest, vectype);
>

Reply via email to