re PR tree-optimization/71483 (g++ ICE at -O3 on valid code on x86_64-linux-gnu with...
authorAlan Hayward <alan.hayward@arm.com>
Wed, 15 Jun 2016 15:45:47 +0000 (15:45 +0000)
committerAlan Hayward <alahay01@gcc.gnu.org>
Wed, 15 Jun 2016 15:45:47 +0000 (15:45 +0000)
2016-06-15  Alan Hayward  <alan.hayward@arm.com>

gcc/
PR tree-optimization/71483
* tree-vect-loop.c (vectorizable_live_operation): Pick correct index
for slp

testsuite/
PR tree-optimization/71483
* g++.dg/vect/pr71483.c: New

From-SVN: r237483

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr71483.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 01d50905dff7a223bf18aba5d7cf99b0f3de91f9..88c1e0f253b6fc9c99923cf05ec80f84f6e4cd84 100644 (file)
@@ -1,3 +1,9 @@
+2016-06-15  Alan Hayward  <alan.hayward@arm.com>
+
+       PR tree-optimization/71483
+       * tree-vect-loop.c (vectorizable_live_operation): Pick correct index
+       for slp
+
 2016-06-15  Martin Liska  <mliska@suse.cz>
 
        * predict.c (tree_predict_by_opcode): Call predict_edge_def
index d9dd04db11833bbeabe572048ac6bbb2aefe3ab7..60c3192c90bd827d1ec91ace1bad0abac0bce608 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-15  Alan Hayward  <alan.hayward@arm.com>
+
+       PR tree-optimization/71483
+       * g++.dg/vect/pr71483.c: New
+
 2016-06-15  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/70202
diff --git a/gcc/testsuite/g++.dg/vect/pr71483.c b/gcc/testsuite/g++.dg/vect/pr71483.c
new file mode 100644 (file)
index 0000000..77f879c
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+int b, c, d;
+short *e;
+void fn1() {
+  for (; b; b--) {
+    d = *e >> 2;
+    *e++ = d;
+    c = *e;
+    *e++ = d;
+  }
+}
index 4c8678505df6ec572b69fd7d12ac55cf4619ece6..a2413bf9c678d11cc2ffd22bc7d984e911831804 100644 (file)
@@ -6368,24 +6368,20 @@ vectorizable_live_operation (gimple *stmt,
 
       int num_scalar = SLP_TREE_SCALAR_STMTS (slp_node).length ();
       int num_vec = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
-      int scalar_per_vec = num_scalar / num_vec;
 
-      /* There are three possibilites here:
-        1: All scalar stmts fit in a single vector.
-        2: All scalar stmts fit multiple times into a single vector.
-           We must choose the last occurence of stmt in the vector.
-        3: Scalar stmts are split across multiple vectors.
-           We must choose the correct vector and mod the lane accordingly.  */
+      /* Get the last occurrence of the scalar index from the concatenation of
+        all the slp vectors. Calculate which slp vector it is and the index
+        within.  */
+      int pos = (num_vec * nunits) - num_scalar + slp_index;
+      int vec_entry = pos / nunits;
+      int vec_index = pos % nunits;
 
       /* Get the correct slp vectorized stmt.  */
-      int vec_entry = slp_index / scalar_per_vec;
       vec_lhs = gimple_get_lhs (SLP_TREE_VEC_STMTS (slp_node)[vec_entry]);
 
       /* Get entry to use.  */
-      bitstart = build_int_cst (unsigned_type_node,
-                               scalar_per_vec - (slp_index % scalar_per_vec));
+      bitstart = build_int_cst (unsigned_type_node, vec_index);
       bitstart = int_const_binop (MULT_EXPR, bitsize, bitstart);
-      bitstart = int_const_binop (MINUS_EXPR, vec_bitsize, bitstart);
     }
   else
     {