This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Re: vector shift regression on sparc


On Mon, Oct 31, 2011 at 01:14:25PM +0200, Ira Rosen wrote:
> > --- gcc/tree-vect-stmts.c.jj ? ?2011-10-28 16:21:06.000000000 +0200
> > +++ gcc/tree-vect-stmts.c ? ? ? 2011-10-31 10:27:57.000000000 +0100
> > @@ -2446,7 +2446,10 @@ vectorizable_shift (gimple stmt, gimple_
> > ? ? ? optab = optab_for_tree_code (code, vectype, optab_vector);
> > ? ? ? if (vect_print_dump_info (REPORT_DETAILS))
> > ? ? ? ? fprintf (vect_dump, "vector/vector shift/rotate found.");
> > - ? ? ?if (TYPE_MODE (op1_vectype) != TYPE_MODE (vectype))
> > + ? ? ?if (!op1_vectype)
> > + ? ? ? op1_vectype = get_same_sized_vectype (TREE_TYPE (op1), vectype_out);
> > + ? ? ?if (op1_vectype == NULL_TREE
> > + ? ? ? ? || TYPE_MODE (op1_vectype) != TYPE_MODE (vectype))
> > ? ? ? ?{
> > ? ? ? ? ?if (vect_print_dump_info (REPORT_DETAILS))
> > ? ? ? ? ? ?fprintf (vect_dump, "unusable type for last operand in"
> > @@ -2480,9 +2483,28 @@ vectorizable_shift (gimple stmt, gimple_
> > ? ? ? ? ? ? ? /* Unlike the other binary operators, shifts/rotates have
> > ? ? ? ? ? ? ? ? ?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 short/char. ?*/
> > + ? ? ? ? ? ? ? ?dealing with vectors of long long/long/short/char. ?*/
> > ? ? ? ? ? ? ? if (dt[1] == vect_constant_def)
> > ? ? ? ? ? ? ? ? op1 = fold_convert (TREE_TYPE (vectype), op1);
> > + ? ? ? ? ? ? else if (!useless_type_conversion_p (TREE_TYPE (vectype),
> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TREE_TYPE (op1)))
> 
> What happens in case dt[1] == vect_internal_def?

For !slp_node we can't reach this with dt1[1] == vect_internal_def,
because of:
  if (dt[1] == vect_internal_def && !slp_node)
    scalar_shift_arg = false;
And for slp_node I'm just giving up if type modes don't match:

> > + ? ? ? ? ? ? ? {
> > + ? ? ? ? ? ? ? ? if (slp_node
> > + ? ? ? ? ? ? ? ? ? ? && TYPE_MODE (TREE_TYPE (vectype))
> > + ? ? ? ? ? ? ? ? ? ? ? ?!= TYPE_MODE (TREE_TYPE (op1)))
> > + ? ? ? ? ? ? ? ? ? {
> > + ? ? ? ? ? ? ? ? ? ? if (vect_print_dump_info (REPORT_DETAILS))
> > + ? ? ? ? ? ? ? ? ? ? fprintf (vect_dump, "unusable type for last operand in"
> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? " vector/vector shift/rotate.");
> > + ? ? ? ? ? ? ? ? ? ? ? return false;
> > + ? ? ? ? ? ? ? ? ? }

BTW, even the pre-existing if (dt[1] == vect_constant_def) doesn't seem to
be 100% correct for slp_node != NULL, I think vect_get_constant_vectors
will in that case create a VECTOR_CST with the desirable vector type
(same type mode as op0's vector type mode), but the constants in the
VECTOR_CST will have a wrong type (say V4DImode VECTOR_CST with
SImode constants in its constructor).  The expander doesn't ICE on it
though.

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]