On Fri, Mar 1, 2019 at 11:45 AM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> This is another case in which we were failing to pass the expected
> mask vector type to vect_get_vec_def_for_operand.  Really looking
> forward to seeing this non-SLP structure go away :-)
>
> Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf
> and x86_64-linux-gnu.  OK to install?

OK.

Richard.

> Richard
>
>
> 2019-03-01  Richard Sandiford  <richard.sandif...@arm.com>
>
> gcc/
>         PR tree-optimization/89535
>         * tree-vect-stmts.c (vectorizable_call): Record the vector types
>         for each operand.  Calculate the fallback choice for mask operands
>         and pass it to vect_get_vec_def_for_operand.
>
> gcc/testsuite/
>         PR tree-optimization/89535
>         * gfortran.dg/vect/pr89535.f90: New test.
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2019-01-25 12:10:12.913100840 +0000
> +++ gcc/tree-vect-stmts.c       2019-03-01 10:43:26.652480564 +0000
> @@ -3123,6 +3123,7 @@ vectorizable_call (stmt_vec_info stmt_in
>    enum vect_def_type dt[4]
>      = { vect_unknown_def_type, vect_unknown_def_type, vect_unknown_def_type,
>         vect_unknown_def_type };
> +  tree vectypes[ARRAY_SIZE (dt)] = {};
>    int ndts = ARRAY_SIZE (dt);
>    int ncopies, j;
>    auto_vec<tree, 8> vargs;
> @@ -3182,10 +3183,8 @@ vectorizable_call (stmt_vec_info stmt_in
>
>    for (i = 0; i < nargs; i++)
>      {
> -      tree opvectype;
> -
>        op = gimple_call_arg (stmt, i);
> -      if (!vect_is_simple_use (op, vinfo, &dt[i], &opvectype))
> +      if (!vect_is_simple_use (op, vinfo, &dt[i], &vectypes[i]))
>         {
>           if (dump_enabled_p ())
>             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -3211,9 +3210,9 @@ vectorizable_call (stmt_vec_info stmt_in
>         rhs_type = TREE_TYPE (op);
>
>        if (!vectype_in)
> -       vectype_in = opvectype;
> -      else if (opvectype
> -              && opvectype != vectype_in)
> +       vectype_in = vectypes[i];
> +      else if (vectypes[i]
> +              && vectypes[i] != vectype_in)
>         {
>           if (dump_enabled_p ())
>             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -3446,12 +3445,19 @@ vectorizable_call (stmt_vec_info stmt_in
>               continue;
>             }
>
> +         if (mask_opno >= 0 && !vectypes[mask_opno])
> +           {
> +             gcc_assert (modifier != WIDEN);
> +             vectypes[mask_opno]
> +               = build_same_sized_truth_vector_type (vectype_in);
> +           }
> +
>           for (i = 0; i < nargs; i++)
>             {
>               op = gimple_call_arg (stmt, i);
>               if (j == 0)
>                 vec_oprnd0
> -                 = vect_get_vec_def_for_operand (op, stmt_info);
> +                 = vect_get_vec_def_for_operand (op, stmt_info, vectypes[i]);
>               else
>                 vec_oprnd0
>                   = vect_get_vec_def_for_stmt_copy (vinfo, orig_vargs[i]);
> @@ -3584,7 +3590,8 @@ vectorizable_call (stmt_vec_info stmt_in
>               if (j == 0)
>                 {
>                   vec_oprnd0
> -                   = vect_get_vec_def_for_operand (op, stmt_info);
> +                   = vect_get_vec_def_for_operand (op, stmt_info,
> +                                                   vectypes[i]);
>                   vec_oprnd1
>                     = vect_get_vec_def_for_stmt_copy (vinfo, vec_oprnd0);
>                 }
> Index: gcc/testsuite/gfortran.dg/vect/pr89535.f90
> ===================================================================
> --- /dev/null   2019-02-27 08:05:34.202446820 +0000
> +++ gcc/testsuite/gfortran.dg/vect/pr89535.f90  2019-03-01 10:43:26.652480564 
> +0000
> @@ -0,0 +1,18 @@
> +! { dg-do compile }
> +
> +subroutine foo(tmp1, tmp2, tmp3)
> +  integer, parameter :: n = 100
> +  real :: tmp1(n,2), tmp2(n), tmp3(n)
> +  integer :: i, c1, c2, c3
> +  logical :: cond
> +  common c1, c2, c3
> +
> +  c2 = c3
> +  cond = c1 .eq. 1 .and. c3 .eq. 1
> +  do i = 1,100
> +     if (cond) tmp2(i) = tmp1(i,1) / tmp1(i,2)
> +  end do
> +  do i = 1,100
> +     if (cond) tmp3(i) = tmp2(i)
> +  end do
> +end subroutine foo

Reply via email to