re PR target/65369 (nettle test failure on powerpc64le-linux-gnu when built with...
authorJakub Jelinek <jakub@redhat.com>
Sat, 14 Mar 2015 09:56:39 +0000 (10:56 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 14 Mar 2015 09:56:39 +0000 (10:56 +0100)
PR tree-optimization/65369
* tree-vect-stmts.c (vectorizable_load) <case dr_explicit_realign>:
Set bump to vs * TYPE_SIZE_UNIT (elem_type) - 1 instead of
(vs - 1) * TYPE_SIZE_UNIT (elem_type).

* gcc.c-torture/execute/pr65369.c: New test.

From-SVN: r221435

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr65369.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 8a387687eacf35e748d26b0ed2c41b70204512e4..e87e5fccb73f44ee85d7f7b2ad42560d27edfbec 100644 (file)
@@ -1,5 +1,10 @@
 2015-03-14  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/65369
+       * tree-vect-stmts.c (vectorizable_load) <case dr_explicit_realign>:
+       Set bump to vs * TYPE_SIZE_UNIT (elem_type) - 1 instead of
+       (vs - 1) * TYPE_SIZE_UNIT (elem_type).
+
        PR tree-optimization/65418
        * tree-ssa-reassoc.c (extract_bit_test_mask): If there
        are casts in the first PLUS_EXPR operand, ensure tbias and
index e4a92af2dab8047bf1fb30a11144797ff38e9a7a..cbd544d12b19d600f706ff4fe4a6d272c7f5b531 100644 (file)
@@ -1,5 +1,8 @@
 2015-03-14  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/65369
+       * gcc.c-torture/execute/pr65369.c: New test.
+
        PR tree-optimization/65418
        * gcc.c-torture/execute/pr65418-1.c: New test.
        * gcc.c-torture/execute/pr65418-2.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65369.c b/gcc/testsuite/gcc.c-torture/execute/pr65369.c
new file mode 100644 (file)
index 0000000..339915e
--- /dev/null
@@ -0,0 +1,45 @@
+/* PR tree-optimization/65369 */
+
+static const char data[] =
+  "12345678901234567890123456789012345678901234567890"
+  "123456789012345678901234567890";
+
+__attribute__ ((noinline))
+static void foo (const unsigned int *buf)
+{
+  if (__builtin_memcmp (buf, data, 64))
+    __builtin_abort ();
+}
+
+__attribute__ ((noinline))
+static void bar (const unsigned char *block)
+{
+  unsigned int buf[16];
+  __builtin_memcpy (buf +  0, block +  0, 4);
+  __builtin_memcpy (buf +  1, block +  4, 4);
+  __builtin_memcpy (buf +  2, block +  8, 4);
+  __builtin_memcpy (buf +  3, block + 12, 4);
+  __builtin_memcpy (buf +  4, block + 16, 4);
+  __builtin_memcpy (buf +  5, block + 20, 4);
+  __builtin_memcpy (buf +  6, block + 24, 4);
+  __builtin_memcpy (buf +  7, block + 28, 4);
+  __builtin_memcpy (buf +  8, block + 32, 4);
+  __builtin_memcpy (buf +  9, block + 36, 4);
+  __builtin_memcpy (buf + 10, block + 40, 4);
+  __builtin_memcpy (buf + 11, block + 44, 4);
+  __builtin_memcpy (buf + 12, block + 48, 4);
+  __builtin_memcpy (buf + 13, block + 52, 4);
+  __builtin_memcpy (buf + 14, block + 56, 4);
+  __builtin_memcpy (buf + 15, block + 60, 4);
+  foo (buf);
+}
+
+int
+main ()
+{
+  unsigned char input[sizeof data + 16] __attribute__((aligned (16)));
+  __builtin_memset (input, 0, sizeof input);
+  __builtin_memcpy (input + 1, data, sizeof data);
+  bar (input + 1);
+  return 0;
+}
index 41ff80245e559869a405d9ad867694e91a27a555..e0cebc685b16f74bf401fff846d02b175a6016f2 100644 (file)
@@ -6468,9 +6468,8 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
                case dr_explicit_realign:
                  {
                    tree ptr, bump;
-                   tree vs_minus_1;
 
-                   vs_minus_1 = size_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
+                   tree vs = size_int (TYPE_VECTOR_SUBPARTS (vectype));
 
                    if (compute_in_loop)
                      msq = vect_setup_realignment (first_stmt, gsi,
@@ -6499,8 +6498,9 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
                    vect_finish_stmt_generation (stmt, new_stmt, gsi);
                    msq = new_temp;
 
-                   bump = size_binop (MULT_EXPR, vs_minus_1,
+                   bump = size_binop (MULT_EXPR, vs,
                                       TYPE_SIZE_UNIT (elem_type));
+                   bump = size_binop (MINUS_EXPR, bump, size_one_node);
                    ptr = bump_vector_ptr (dataref_ptr, NULL, gsi, stmt, bump);
                    new_stmt = gimple_build_assign
                                 (NULL_TREE, BIT_AND_EXPR, ptr,