summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-14 09:56:39 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-14 09:56:39 +0000
commitc6d23cfcf675988f82ec95c83b0e2000645c61bb (patch)
tree229cae22bf6424d52651925a796ec94bb05934c4
parentf6835415207ce5899afcab0ea7be94c1f3a39536 (diff)
downloadgcc-c6d23cfcf675988f82ec95c83b0e2000645c61bb.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221435 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr65369.c45
-rw-r--r--gcc/tree-vect-stmts.c6
4 files changed, 56 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8a387687eac..e87e5fccb73 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e4a92af2dab..cbd544d12b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..339915e9521
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr65369.c
@@ -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;
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 41ff80245e5..e0cebc685b1 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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,