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.

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.

As said I prefer to not mangle the existing stmt checking too much
at this stage so minimal adjustment is prefered there.

Thanks,
Richard.

> Thanks,
> Richard
> 
> >
> > I'd rather go with the simpler patch I posted as reply to the earlier
> > mail rather such large refactoring at this point.
> >
> > Richard.
> >
> >> Thanks,
> >> Richard
> >> 
> >> >
> >> > Thanks,
> >> > Prathamesh
> >> >
> >> > diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> >> > index 672e384ef09..9f91878c468 100644
> >> > --- a/gcc/tree-cfg.c
> >> > +++ b/gcc/tree-cfg.c
> >> > @@ -4325,10 +4325,11 @@ verify_gimple_assign_ternary (gassign *stmt)
> >> >        break;
> >> >  
> >> >      case VEC_PERM_EXPR:
> >> > -      if (!useless_type_conversion_p (lhs_type, rhs1_type)
> >> > -          || !useless_type_conversion_p (lhs_type, rhs2_type))
> >> > +      if (TREE_CODE (rhs1_type) != VECTOR_TYPE
> >> > +          || TREE_CODE (rhs2_type) != VECTOR_TYPE
> >> > +          || TREE_CODE (rhs3_type) != VECTOR_TYPE)
> >> >          {
> >> > -          error ("type mismatch in %qs", code_name);
> >> > +          error ("vector types expected in %qs", code_name);
> >> >            debug_generic_expr (lhs_type);
> >> >            debug_generic_expr (rhs1_type);
> >> >            debug_generic_expr (rhs2_type);
> >> > @@ -4336,11 +4337,14 @@ verify_gimple_assign_ternary (gassign *stmt)
> >> >            return true;
> >> >          }
> >> >  
> >> > -      if (TREE_CODE (rhs1_type) != VECTOR_TYPE
> >> > -          || TREE_CODE (rhs2_type) != VECTOR_TYPE
> >> > -          || TREE_CODE (rhs3_type) != VECTOR_TYPE)
> >> > +      if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
> >> > +          || (TREE_CODE (rhs3) != VECTOR_CST
> >> > +              && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE
> >> > +                                    (TREE_TYPE (rhs3_type)))
> >> > +                  != GET_MODE_BITSIZE (SCALAR_TYPE_MODE
> >> > +                                       (TREE_TYPE (rhs1_type))))))
> >> >          {
> >> > -          error ("vector types expected in %qs", code_name);
> >> > +          error ("invalid mask type in %qs", code_name);
> >> >            debug_generic_expr (lhs_type);
> >> >            debug_generic_expr (rhs1_type);
> >> >            debug_generic_expr (rhs2_type);
> >> > @@ -4348,15 +4352,18 @@ verify_gimple_assign_ternary (gassign *stmt)
> >> >            return true;
> >> >          }
> >> >  
> >> > -      if (maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
> >> > -                    TYPE_VECTOR_SUBPARTS (rhs2_type))
> >> > -          || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs2_type),
> >> > -                       TYPE_VECTOR_SUBPARTS (rhs3_type))
> >> > -          || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs3_type),
> >> > -                       TYPE_VECTOR_SUBPARTS (lhs_type)))
> >> > +      /* Accept lhs = vec_perm_expr<v, v, mask> if lhs is vector length 
> >> > agnostic,
> >> > +         and has same element type as v.  */
> >> > +      if (!TYPE_VECTOR_SUBPARTS (lhs_type).is_constant ()
> >> > +          && operand_equal_p (rhs1, rhs2, 0)
> >> > +          && TYPE_VECTOR_SUBPARTS (rhs1_type).is_constant ()
> >> > +          && TREE_TYPE (lhs_type) == TREE_TYPE (rhs1_type)) 
> >> > +        return false;
> >> > +
> >> > +      if (!useless_type_conversion_p (lhs_type, rhs1_type)
> >> > +          || !useless_type_conversion_p (lhs_type, rhs2_type))
> >> >          {
> >> > -          error ("vectors with different element number found in %qs",
> >> > -                 code_name);
> >> > +          error ("type mismatch in %qs", code_name);
> >> >            debug_generic_expr (lhs_type);
> >> >            debug_generic_expr (rhs1_type);
> >> >            debug_generic_expr (rhs2_type);
> >> > @@ -4364,21 +4371,21 @@ verify_gimple_assign_ternary (gassign *stmt)
> >> >            return true;
> >> >          }
> >> >  
> >> > -      if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
> >> > -          || (TREE_CODE (rhs3) != VECTOR_CST
> >> > -              && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE
> >> > -                                    (TREE_TYPE (rhs3_type)))
> >> > -                  != GET_MODE_BITSIZE (SCALAR_TYPE_MODE
> >> > -                                       (TREE_TYPE (rhs1_type))))))
> >> > +      if (maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
> >> > +                    TYPE_VECTOR_SUBPARTS (rhs2_type))
> >> > +          || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs2_type),
> >> > +                       TYPE_VECTOR_SUBPARTS (rhs3_type))
> >> > +          || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs3_type),
> >> > +                       TYPE_VECTOR_SUBPARTS (lhs_type)))
> >> >          {
> >> > -          error ("invalid mask type in %qs", code_name);
> >> > +          error ("vectors with different element number found in %qs",
> >> > +                 code_name);
> >> >            debug_generic_expr (lhs_type);
> >> >            debug_generic_expr (rhs1_type);
> >> >            debug_generic_expr (rhs2_type);
> >> >            debug_generic_expr (rhs3_type);
> >> >            return true;
> >> >          }
> >> > -
> >> >        return false;
> >> >  
> >> >      case SAD_EXPR:
> >> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to