Patchwork Fix VEC_[LR]SHIFT_EXPR folding for big-endian (PR tree-optimization/57051)

login
register
mail settings
Submitter Jakub Jelinek
Date May 17, 2013, 6:47 a.m.
Message ID <20130517064749.GO1377@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/244509/
State New
Headers show

Comments

Jakub Jelinek - May 17, 2013, 6:47 a.m.
On Thu, May 16, 2013 at 07:59:00PM +0200, Mikael Pettersson wrote:
> Jakub Jelinek writes:
>  > On Thu, Apr 25, 2013 at 11:47:02PM +0200, Jakub Jelinek wrote:
>  > > This patch adds folding of constant arguments v>> and v<<, which helps to
>  > > optimize the testcase from the PR back into constant store after vectorized
>  > > loop is unrolled.
>  > 
>  > As this fixes a regression on the 4.8 branch, I've backported it (and
>  > minimal prerequisite for that) to 4.8 branch too.
> 
> Unfortunately this patch makes gcc.dg/vect/no-scevccp-outer-{7,13}.c fail
> on powerpc64-linux:
> 
> +FAIL: gcc.dg/vect/no-scevccp-outer-13.c execution test
> +FAIL: gcc.dg/vect/no-scevccp-outer-7.c execution test
> 
> which is a regression from 4.8-20130502.  Reverting r198580 fixes it.
> 
> The same FAILs also occur on trunk.

Ah right, I was confused by the fact that VEC_RSHIFT_EXPR is used
not just on little endian targets, but on big endian as well
(VEC_LSHIFT_EXPR is never emitted), but the important spot is
when extracting the scalar result from the vector:

      if (BYTES_BIG_ENDIAN)
        bitpos = size_binop (MULT_EXPR,
                             bitsize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1),
                             TYPE_SIZE (scalar_type));
      else
        bitpos = bitsize_zero_node;

Fixed thusly, ok for trunk/4.8?

2013-05-17  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/57051
	* fold-const.c (const_binop) <case VEC_LSHIFT_EXPR,
	case VEC_RSHIFT_EXPR>: Fix BYTES_BIG_ENDIAN handling.



	Jakub
Richard Guenther - May 17, 2013, 8:02 a.m.
On Fri, 17 May 2013, Jakub Jelinek wrote:

> On Thu, May 16, 2013 at 07:59:00PM +0200, Mikael Pettersson wrote:
> > Jakub Jelinek writes:
> >  > On Thu, Apr 25, 2013 at 11:47:02PM +0200, Jakub Jelinek wrote:
> >  > > This patch adds folding of constant arguments v>> and v<<, which helps to
> >  > > optimize the testcase from the PR back into constant store after vectorized
> >  > > loop is unrolled.
> >  > 
> >  > As this fixes a regression on the 4.8 branch, I've backported it (and
> >  > minimal prerequisite for that) to 4.8 branch too.
> > 
> > Unfortunately this patch makes gcc.dg/vect/no-scevccp-outer-{7,13}.c fail
> > on powerpc64-linux:
> > 
> > +FAIL: gcc.dg/vect/no-scevccp-outer-13.c execution test
> > +FAIL: gcc.dg/vect/no-scevccp-outer-7.c execution test
> > 
> > which is a regression from 4.8-20130502.  Reverting r198580 fixes it.
> > 
> > The same FAILs also occur on trunk.
> 
> Ah right, I was confused by the fact that VEC_RSHIFT_EXPR is used
> not just on little endian targets, but on big endian as well
> (VEC_LSHIFT_EXPR is never emitted), but the important spot is
> when extracting the scalar result from the vector:
> 
>       if (BYTES_BIG_ENDIAN)
>         bitpos = size_binop (MULT_EXPR,
>                              bitsize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1),
>                              TYPE_SIZE (scalar_type));
>       else
>         bitpos = bitsize_zero_node;
> 
> Fixed thusly, ok for trunk/4.8?

Ok with a comment in front of (code == VEC_RSHIFT_EXPR) ^ 
(!BYTES_BIG_ENDIAN)

Thanks,
Richard.

> 2013-05-17  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/57051
> 	* fold-const.c (const_binop) <case VEC_LSHIFT_EXPR,
> 	case VEC_RSHIFT_EXPR>: Fix BYTES_BIG_ENDIAN handling.
> 
> --- gcc/fold-const.c.jj	2013-05-16 12:36:28.000000000 +0200
> +++ gcc/fold-const.c	2013-05-17 08:38:12.575117676 +0200
> @@ -1393,7 +1393,7 @@ const_binop (enum tree_code code, tree a
>  	  if (shiftc >= outerc || (shiftc % innerc) != 0)
>  	    return NULL_TREE;
>  	  int offset = shiftc / innerc;
> -	  if (code == VEC_LSHIFT_EXPR)
> +	  if ((code == VEC_RSHIFT_EXPR) ^ (!BYTES_BIG_ENDIAN))
>  	    offset = -offset;
>  	  tree zero = build_zero_cst (TREE_TYPE (type));
>  	  for (i = 0; i < count; i++)
> 
> 
> 	Jakub
> 
>

Patch

--- gcc/fold-const.c.jj	2013-05-16 12:36:28.000000000 +0200
+++ gcc/fold-const.c	2013-05-17 08:38:12.575117676 +0200
@@ -1393,7 +1393,7 @@  const_binop (enum tree_code code, tree a
 	  if (shiftc >= outerc || (shiftc % innerc) != 0)
 	    return NULL_TREE;
 	  int offset = shiftc / innerc;
-	  if (code == VEC_LSHIFT_EXPR)
+	  if ((code == VEC_RSHIFT_EXPR) ^ (!BYTES_BIG_ENDIAN))
 	    offset = -offset;
 	  tree zero = build_zero_cst (TREE_TYPE (type));
 	  for (i = 0; i < count; i++)