summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-01 13:58:13 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-01 13:58:13 +0000
commit11742639d196ec2df0627f9da2561866e9a3bade (patch)
tree58a0d456e364db264f284bada568848ac421360b
parent009baa50551b51d4f9a8a1a826f7a85f7761ee4e (diff)
downloadgcc-11742639d196ec2df0627f9da2561866e9a3bade.tar.gz
2017-08-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/71752 PR tree-optimization/81633 * tree-vect-slp.c (vect_get_slp_defs): Handle null operands in the original suggested way. * gcc.dg/vect/pr81633.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@250779 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr81633.c33
-rw-r--r--gcc/tree-vect-slp.c49
4 files changed, 75 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6b99b453811..5f10502190e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-01 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/71752
+ PR tree-optimization/81633
+ * tree-vect-slp.c (vect_get_slp_defs): Handle null operands
+ in the original suggested way.
+
2017-08-01 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/80769
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2477ff175f8..876ec8a2740 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2017-08-01 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/71752
+ PR tree-optimization/81633
+ * gcc.dg/vect/pr81633.c: New testcase.
+
2017-08-01 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/80769
diff --git a/gcc/testsuite/gcc.dg/vect/pr81633.c b/gcc/testsuite/gcc.dg/vect/pr81633.c
new file mode 100644
index 00000000000..1ae15504e81
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr81633.c
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+
+static double identity[4][4] = {{1, 0, 0, 0},
+ {0, 1, 0, 0},
+ {0, 0, 1, 0},
+ {0, 0, 0, 1}};
+static double expected[4][4] = {{1, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0}};
+
+static void __attribute__((noinline,noclone))
+kernel(double A[4][4])
+{
+ double tmp[4][4];
+ for (int j = 0; j < 4; j++)
+ for (int k = 0; k < 4; k++)
+ tmp[j][k] = identity[j][0] * identity[j][k];
+ for (int j = 0; j < 4; j++ )
+ for (int k = 0; k < 4; k++)
+ A[j][k] = tmp[j][k];
+}
+
+int main(void)
+{
+ double A[4][4] = {{0.0}};
+ kernel(A);
+ for ( int i = 0; i < 4; i++ )
+ for ( int j = 0; j < 4; j++ )
+ if (A[i][j] != expected[i][j])
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index e254aa0e49f..c8bcce01bb4 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -3289,19 +3289,22 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
{
gimple *first_stmt;
int number_of_vects = 0, i;
+ unsigned int child_index = 0;
HOST_WIDE_INT lhs_size_unit, rhs_size_unit;
slp_tree child = NULL;
vec<tree> vec_defs;
tree oprnd;
+ bool vectorized_defs;
bool first_iteration = true;
first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
FOR_EACH_VEC_ELT (ops, i, oprnd)
{
- bool vectorized_defs = false;
-
if (oprnd == NULL)
{
+ /* Only vectorizable_reduction will call us with a NULL op which
+ will always match the reduction operand for which we have no
+ SLP child. */
vec_defs = vNULL;
vec_defs.create (0);
vec_oprnds->quick_push (vec_defs);
@@ -3312,9 +3315,10 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
node or we need to create them (for invariants and constants). We
check if the LHS of the first stmt of the next child matches OPRND.
If it does, we found the correct child. Otherwise, we call
- vect_get_constant_vectors (). */
- for (unsigned int child_index = 0;
- child_index < SLP_TREE_CHILDREN (slp_node).length (); child_index++)
+ vect_get_constant_vectors (), and not advance CHILD_INDEX in order
+ to check this child node for the next operand. */
+ vectorized_defs = false;
+ if (SLP_TREE_CHILDREN (slp_node).length () > child_index)
{
child = SLP_TREE_CHILDREN (slp_node)[child_index];
@@ -3334,25 +3338,30 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
statements. */
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child);
vectorized_defs = true;
- break;
+ child_index++;
}
}
+ else
+ child_index++;
}
- if (!vectorized_defs && first_iteration)
- {
- number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
- /* Number of vector stmts was calculated according to LHS in
- vect_schedule_slp_instance (), fix it by replacing LHS with
- RHS, if necessary. See vect_get_smallest_scalar_type () for
- details. */
- vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
- &rhs_size_unit);
- if (rhs_size_unit != lhs_size_unit)
- {
- number_of_vects *= rhs_size_unit;
- number_of_vects /= lhs_size_unit;
- }
+ if (!vectorized_defs)
+ {
+ if (first_iteration)
+ {
+ number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
+ /* Number of vector stmts was calculated according to LHS in
+ vect_schedule_slp_instance (), fix it by replacing LHS with
+ RHS, if necessary. See vect_get_smallest_scalar_type () for
+ details. */
+ vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
+ &rhs_size_unit);
+ if (rhs_size_unit != lhs_size_unit)
+ {
+ number_of_vects *= rhs_size_unit;
+ number_of_vects /= lhs_size_unit;
+ }
+ }
}
/* Allocate memory for vectorized defs. */