re PR tree-optimization/71518 (wrong code at -O3 on x86_64-linux-gnu in 64-bit mode...
authorYuri Rumyantsev <ysrumyan@gmail.com>
Wed, 6 Jul 2016 14:37:26 +0000 (14:37 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Wed, 6 Jul 2016 14:37:26 +0000 (14:37 +0000)
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.

From-SVN: r238055

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr71518.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 348b0bb2453a41b40791445823433c1dd48ebb9b..fb611213cb18bed32eaa259cb8049fc0462a91cc 100644 (file)
@@ -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.
index 5dca6f731994d60f3510d5ace1c0a1397a60699d..fa5f1c1694535d34dfa0acfdd88e4ccb52a8b4b6 100644 (file)
@@ -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 (file)
index 0000000..6240ca8
--- /dev/null
@@ -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; 
+}
index f2f0dc50bbda44b72918b28e63a797e617f1c940..6fddd3a1c6894c988751d436df31806bff796b10 100644 (file)
@@ -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);
     }