Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> writes:
> On Tue, 4 Jan 2022 at 19:12, Richard Sandiford
> <richard.sandif...@arm.com> wrote:
>>
>> Richard Biener <rguent...@suse.de> writes:
>> > On Tue, 4 Jan 2022, Richard Sandiford wrote:
>> >
>> >> Richard Biener <rguent...@suse.de> writes:
>> >> > On Fri, 17 Dec 2021, Richard Sandiford wrote:
>> >> >
>> >> >> Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> writes:
>> >> >> > Hi,
>> >> >> > The attached patch rearranges order of type-check for vec_perm_expr
>> >> >> > and relaxes type checking for
>> >> >> > lhs = vec_perm_expr<rhs1, rhs2, mask>
>> >> >> >
>> >> >> > when:
>> >> >> > rhs1 == rhs2,
>> >> >> > lhs is variable length vector,
>> >> >> > rhs1 is fixed length vector,
>> >> >> > TREE_TYPE (lhs) == TREE_TYPE (rhs1)
>> >> >> >
>> >> >> > I am not sure tho if this check is correct ? My intent was to capture
>> >> >> > case when vec_perm_expr is used to "extend" fixed length vector to
>> >> >> > it's VLA equivalent.
>> >> >>
>> >> >> VLAness isn't really the issue.  We want the same thing to work for
>> >> >> -msve-vector-bits=256, -msve-vector-bits=512, etc., even though the
>> >> >> vectors are fixed-length in that case.
>> >> >>
>> >> >> The principle is that for:
>> >> >>
>> >> >>   A = VEC_PERM_EXPR <B, C, D>;
>> >> >>
>> >> >> the requirements are:
>> >> >>
>> >> >> - A, B, C and D must be vectors
>> >> >> - A, B and C must have the same element type
>> >> >> - D must have an integer element type
>> >> >> - A and D must have the same number of elements (NA)
>> >> >> - B and C must have the same number of elements (NB)
>> >> >>
>> >> >> The semantics are that we create a joined vector BC (all elements of B
>> >> >> followed by all element of C) and that:
>> >> >>
>> >> >>   A[i] = BC[D[i] % (NB+NB)]
>> >> >>
>> >> >> for 0 ≤ i < NA.
>> >> >>
>> >> >> This operation makes sense even if NA != NB.
>> >> >
>> >> > But note that we don't currently expect NA != NB and the optab just
>> >> > has a single mode.
>> >>
>> >> True, but we only need this for constant permutes.  They are already
>> >> special in that they allow the index elements to be wider than the data
>> >> elements.
>> >
>> > OK, then we should reflect this in the stmt verification and only relax
>> > the constant permute vector case and also amend the
>> > TARGET_VECTORIZE_VEC_PERM_CONST accordingly.
>>
>> Sounds good.
>>
>> > For non-constant permutes the docs say the mode of vec_perm is
>> > the common mode of operands 1 and 2 whilst the mode of operand 0
>> > is unspecified - even unconstrained by the docs.  I'm not sure
>> > if vec_perm expansion is expected to eventually FAIL.  Updating the
>> > docs of vec_perm would be appreciated as well.
>>
>> Yeah, I guess de facto operand 0 has to be the same mode as operands
>> 1 and 2.  Maybe that was just an oversight, or maybe it seemed obvious
>> or self-explanatory at the time. :-)
>>
>> > As said I prefer to not mangle the existing stmt checking too much
>> > at this stage so minimal adjustment is prefered there.
>>
>> The PR is only an enhancement request rather than a bug, so I think the
>> patch would need to wait for GCC 13 whatever happens.
> Hi,
> In attached patch, the type checking is relaxed only if mask is constant.
> Does this look OK ?
>
> Thanks,
> Prathamesh
>>
>> Thanks,
>> Richard
>
> diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> index e321d929fd0..02b88f67855 100644
> --- a/gcc/tree-cfg.cc
> +++ b/gcc/tree-cfg.cc
> @@ -4307,6 +4307,24 @@ verify_gimple_assign_ternary (gassign *stmt)
>        break;
>  
>      case VEC_PERM_EXPR:
> +      /* If permute is constant, then we allow for lhs and rhs
> +      to have different vector types, provided:
> +      (1) lhs, rhs1, rhs2, and rhs3 have same element type.

This isn't a requirement for rhs3.

> +      (2) rhs3 vector has integer element type.
> +      (3) len(lhs) == len(rhs3) && len(rhs1) == len(rhs2).  */
> +
> +      if (TREE_CONSTANT (rhs3)
> +       && VECTOR_TYPE_P (lhs_type)
> +       && VECTOR_TYPE_P (rhs1_type)
> +       && VECTOR_TYPE_P (rhs2_type)
> +       && VECTOR_TYPE_P (rhs3_type)
> +       && TREE_TYPE (lhs_type) == TREE_TYPE (rhs1_type)
> +       && TREE_TYPE (lhs_type) == TREE_TYPE (rhs2_type)
> +       && INTEGRAL_TYPE_P (TREE_TYPE (rhs3_type))
> +       && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type), TYPE_VECTOR_SUBPARTS 
> (rhs3_type))
> +       && known_eq (TYPE_VECTOR_SUBPARTS (rhs1_type), TYPE_VECTOR_SUBPARTS 
> (rhs2_type)))
> +     return false;
> +

I think this should be integrated into the existing conditions
rather than done as an initial special case.

It might make sense to start with:

      if (TREE_CODE (rhs1_type) != VECTOR_TYPE
          || TREE_CODE (rhs2_type) != VECTOR_TYPE
          || TREE_CODE (rhs3_type) != VECTOR_TYPE)
        {

but expanded to test lhs_type too.  Then the other parts of the new test
should be distributed across the existing conditions.

The type tests should use useless_type_conversion_p rather than ==.

Thanks,
Richard



>        if (!useless_type_conversion_p (lhs_type, rhs1_type)
>         || !useless_type_conversion_p (lhs_type, rhs2_type))
>       {

Reply via email to