===================================================================
@@ -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.
===================================================================
@@ -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
===================================================================
@@ -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" } } */