summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-06 14:37:26 +0000
committerienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-06 14:37:26 +0000
commit798fc305a4725278709e7d0272a52707f9ea05e2 (patch)
treea9842b56601dec435881edfad0150461d7186126
parent7c8f2bf1b962ec33a42474c0be70e6e017c1a4d1 (diff)
downloadgcc-798fc305a4725278709e7d0272a52707f9ea05e2.tar.gz
gcc/
2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/71518 * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust misalign also for outer loops with negative step. gcc/testsuite/ 2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/71518 * gcc.dg/pr71518.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238055 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr71518.c25
-rw-r--r--gcc/tree-vect-data-refs.c11
4 files changed, 44 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 348b0bb2453..fb611213cb1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
+
+ PR tree-optimization/71518
+ * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust
+ misalign also for outer loops with negative step.
+
2016-07-06 Wilco Dijkstra <wdijkstr@arm.com>
* config/arm/cortex-a53.md: Use final_presence_set for in-order.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5dca6f73199..fa5f1c16945 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
+
+ PR tree-optimization/71518
+ * gcc.dg/pr71518.c: New test.
+
2016-07-06 Wilco Dijkstra <wdijkstr@arm.com>
* gcc.target/arm/vst1Q_laneu64-1.c (foo): Use unsigned char*.
diff --git a/gcc/testsuite/gcc.dg/pr71518.c b/gcc/testsuite/gcc.dg/pr71518.c
new file mode 100644
index 00000000000..6240ca8f2bf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr71518.c
@@ -0,0 +1,25 @@
+/* PR tree-optimization/71518 */
+/* { dg-options "-O3" } */
+
+int a, *b[9], c, d, e;
+
+static int
+fn1 ()
+{
+ for (c = 6; c >= 0; c--)
+ for (d = 0; d < 2; d++)
+ {
+ b[d * 2 + c] = 0;
+ e = a > 1 ? : 0;
+ if (e == 2)
+ return 0;
+ }
+ return 0;
+}
+
+int
+main ()
+{
+ fn1 ();
+ return 0;
+}
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index f2f0dc50bbd..6fddd3a1c68 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -698,6 +698,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
tree base, base_addr;
tree misalign = NULL_TREE;
tree aligned_to;
+ tree step;
unsigned HOST_WIDE_INT alignment;
if (dump_enabled_p ())
@@ -828,16 +829,20 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
DR_VECT_AUX (dr)->base_element_aligned = true;
}
+ if (loop && nested_in_vect_loop_p (loop, stmt))
+ step = STMT_VINFO_DR_STEP (stmt_info);
+ else
+ step = DR_STEP (dr);
/* If this is a backward running DR then first access in the larger
vectype actually is N-1 elements before the address in the DR.
Adjust misalign accordingly. */
- if (tree_int_cst_sgn (DR_STEP (dr)) < 0)
+ if (tree_int_cst_sgn (step) < 0)
{
tree offset = ssize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
/* DR_STEP(dr) is the same as -TYPE_SIZE of the scalar type,
otherwise we wouldn't be here. */
- offset = fold_build2 (MULT_EXPR, ssizetype, offset, DR_STEP (dr));
- /* PLUS because DR_STEP was negative. */
+ offset = fold_build2 (MULT_EXPR, ssizetype, offset, step);
+ /* PLUS because STEP was negative. */
misalign = size_binop (PLUS_EXPR, misalign, offset);
}