Patchwork Fix PR tree-optimization/45902

login
register
mail settings
Submitter Ira Rosen
Date Oct. 13, 2010, 7:43 a.m.
Message ID <OF854127C1.B659B4D9-ONC22577BB.002829BD-C22577BB.002A7287@il.ibm.com>
Download mbox | patch
Permalink /patch/67651/
State New
Headers show

Comments

Ira Rosen - Oct. 13, 2010, 7:43 a.m.
Richard Guenther <richard.guenther@gmail.com> wrote on 12/10/2010 12:08:31
PM:

> >
> > But if it's the first operand then its type is the type of the stmt,
i.e.,
> > we get the same type anyway, right?
>
> Yes.  So your patch looks ok, possibly with a comment that looking
> at either operand is ok.
>

I committed the following:

	* tree-vect-slp.c (vect_get_constant_vectors): Fix comment.
	Use operand's type for POINTER_PLUS_EXPR.
H.J. Lu - Oct. 16, 2010, 5:45 p.m.
On Wed, Oct 13, 2010 at 12:43 AM, Ira Rosen <IRAR@il.ibm.com> wrote:
>
>
> Richard Guenther <richard.guenther@gmail.com> wrote on 12/10/2010 12:08:31
> PM:
>
>> >
>> > But if it's the first operand then its type is the type of the stmt,
> i.e.,
>> > we get the same type anyway, right?
>>
>> Yes.  So your patch looks ok, possibly with a comment that looking
>> at either operand is ok.
>>
>
> I committed the following:
>
>        * tree-vect-slp.c (vect_get_constant_vectors): Fix comment.
>        Use operand's type for POINTER_PLUS_EXPR.
>
>

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46049
H.J. Lu - Oct. 16, 2010, 11:14 p.m.
On Sat, Oct 16, 2010 at 10:45 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Wed, Oct 13, 2010 at 12:43 AM, Ira Rosen <IRAR@il.ibm.com> wrote:
>>
>>
>> Richard Guenther <richard.guenther@gmail.com> wrote on 12/10/2010 12:08:31
>> PM:
>>
>>> >
>>> > But if it's the first operand then its type is the type of the stmt,
>> i.e.,
>>> > we get the same type anyway, right?
>>>
>>> Yes.  So your patch looks ok, possibly with a comment that looking
>>> at either operand is ok.
>>>
>>
>> I committed the following:
>>
>>        * tree-vect-slp.c (vect_get_constant_vectors): Fix comment.
>>        Use operand's type for POINTER_PLUS_EXPR.
>>
>>
>
> This caused:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46049
>
>

It also caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46052

Patch

Index: tree-vect-slp.c
===================================================================
--- tree-vect-slp.c     (revision 165411)
+++ tree-vect-slp.c     (working copy)
@@ -1811,8 +1811,8 @@  vect_update_slp_costs_according_to_vf (l

 /* For constant and loop invariant defs of SLP_NODE this function returns
    (vector) defs (VEC_OPRNDS) that will be used in the vectorized stmts.
-   OP_NUM determines if we gather defs for operand 0 or operand 1 of the
scalar
-   stmts. NUMBER_OF_VECTORS is the number of vector defs to create.
+   OP_NUM determines if we gather defs for operand 0 or operand 1 of the
RHS of
+   scalar stmts.  NUMBER_OF_VECTORS is the number of vector defs to
create.
    REDUC_INDEX is the index of the reduction operand in the statements,
unless
    it is -1.  */

@@ -1836,10 +1836,10 @@  vect_get_constant_vectors (slp_tree slp_
   VEC (tree, heap) *voprnds = VEC_alloc (tree, heap, number_of_vectors);
   bool constant_p, is_store;
   tree neutral_op = NULL;
+  enum tree_code code = gimple_assign_rhs_code (stmt);

   if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def)
     {
-      enum tree_code code = gimple_assign_rhs_code (stmt);
       if (reduc_index == -1)
         {
           VEC_free (tree, heap, *vec_oprnds);
@@ -1895,18 +1895,18 @@  vect_get_constant_vectors (slp_tree slp_
     }

   if (CONSTANT_CLASS_P (op))
-    {
-      constant_p = true;
-      if (POINTER_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
-        vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
-      else
-        vector_type = STMT_VINFO_VECTYPE (stmt_vinfo);
-    }
+    constant_p = true;
   else
-    {
-      constant_p = false;
-      vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
-    }
+    constant_p = false;
+
+  /* For POINTER_PLUS_EXPR we use the type of the constant/invariant
itself.
+     If OP is the first operand of POINTER_PLUS_EXPR, its type is the type
of
+     the statement, so it's OK to use OP's type for both first and second
+     operands.  */
+  if (code == POINTER_PLUS_EXPR)
+    vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
+  else
+    vector_type = STMT_VINFO_VECTYPE (stmt_vinfo);

   gcc_assert (vector_type);
   nunits = TYPE_VECTOR_SUBPARTS (vector_type);


And here is an updated patch for 4.5.
Bootstrapped and tested on x86_64-suse-linux.
OK to commit?

Thanks,
Ira

ChangeLog:

	PR tree-optimization/45902
	* tree-vect-slp.c (vect_get_constant_vectors): Use operand's type
	for POINTER_PLUS_EXPR.

testsuite/ChangeLog:

	PR tree-optimization/45902
	* gcc.dg/vect/45902.c: New test.


Index: tree-vect-slp.c
===================================================================
--- tree-vect-slp.c     (revision 165366)
+++ tree-vect-slp.c     (working copy)
@@ -1446,6 +1446,7 @@  vect_get_constant_vectors (slp_tree slp_
   int number_of_copies = 1;
   VEC (tree, heap) *voprnds = VEC_alloc (tree, heap, number_of_vectors);
   bool constant_p, is_store;
+  enum tree_code code = gimple_assign_rhs_code (stmt);

   if (STMT_VINFO_DATA_REF (stmt_vinfo))
     {
@@ -1463,9 +1464,16 @@  vect_get_constant_vectors (slp_tree slp_
   else
     constant_p = false;

-  vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
-  gcc_assert (vector_type);
+  /* For POINTER_PLUS_EXPR we use the type of the constant/invariant
itself.
+     If OP is the first operand of POINTER_PLUS_EXPR, its type is the type
of
+     the statement, so it's OK to use OP's type for both first and second
+     operands.  */
+  if (code == POINTER_PLUS_EXPR)
+    vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
+  else
+    vector_type = STMT_VINFO_VECTYPE (stmt_vinfo);

+  gcc_assert (vector_type);
   nunits = TYPE_VECTOR_SUBPARTS (vector_type);

   /* NUMBER_OF_COPIES is the number of times we need to use the same
values in
Index: testsuite/gcc.dg/vect/pr45902.c
===================================================================
--- testsuite/gcc.dg/vect/pr45902.c     (revision 0)
+++ testsuite/gcc.dg/vect/pr45902.c     (revision 0)
@@ -0,0 +1,43 @@ 
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include "tree-vect.h"
+
+#define N 128
+
+short res[N];
+short a[N];
+
+int
+main1 ()
+{
+  int i;
+
+  for (i = 0; i < N/4; i+=4)
+    {
+      res[i] = a[i] >> 8;
+      res[i+1] = a[i+1] >> 8;
+      res[i+2] = a[i+2] >> 8;
+      res[i+3] = a[i+3] >> 8;
+    }
+}
+
+int
+main ()
+{
+  int i;
+
+  for (i = 0; i < N; i++)
+    a[i] = i;
+
+  main1 ();
+
+  for (i = 0; i < N; i++)
+    if (res[i] != a[i] >> 8)
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */