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

--- Comment #8 from Ira Rosen <irar at il dot ibm.com> 2010-10-10 12:47:47 UTC 
---
The problem is in creation of constant operands for SLP, and is caused by my
patch r155882, which takes the type for the constant from the constant itself.
This was needed for pointers, but is bad for other cases, like shift of shorts
that is treated as int here, causing wrong code generation.

I am going to test this patch now:

Index: tree-vect-slp.c
===================================================================
--- tree-vect-slp.c     (revision 164987)
+++ tree-vect-slp.c     (working copy)
@@ -1894,13 +1894,20 @@ vect_get_constant_vectors (slp_tree slp_
     }

   if (CONSTANT_CLASS_P (op))
-    constant_p = true;
+    {
+      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);
+    }
   else
-    constant_p = false;
+    {
+      constant_p = false;
+      vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
+    }

-  vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
   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

Reply via email to