aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@linux.alibaba.com>2018-10-15 11:35:56 +0000
committerBin Cheng <amker@gcc.gnu.org>2018-10-15 11:35:56 +0000
commit0df7c778ed50095a0c4b266b4beb8b783de832a8 (patch)
treed04024259b2c9432259a627cb1a3c91d1045e794 /gcc
parent61e189a874392a296e46609502228019cae42e19 (diff)
downloadgcc-0df7c778ed50095a0c4b266b4beb8b783de832a8.zip
gcc-0df7c778ed50095a0c4b266b4beb8b783de832a8.tar.gz
gcc-0df7c778ed50095a0c4b266b4beb8b783de832a8.tar.bz2
re PR tree-optimization/87022 (miscompilation with -ftree-loop-distribution)
PR tree-optimization/87022 * tree-loop-distribution.c (pg_add_dependence_edges): Check all bits in dist vector rather than the first one. gcc/testsuite PR tree-optimization/87022 * gcc.dg/tree-ssa/pr87022.c: New test. From-SVN: r265161
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr87022.c36
-rw-r--r--gcc/tree-loop-distribution.c3
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 742f5cf..a11504a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-10-15 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/87022
+ * tree-loop-distribution.c (pg_add_dependence_edges): Check all
+ bits in dist vector rather than the first one.
+
2018-10-15 Richard Biener <rguenther@suse.de>
PR middle-end/87610
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e189162..df20c3c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-15 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/87022
+ * gcc.dg/tree-ssa/pr87022.c: New test.
+
2018-10-15 Richard Biener <rguenther@suse.de>
PR middle-end/87610
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr87022.c b/gcc/testsuite/gcc.dg/tree-ssa/pr87022.c
new file mode 100644
index 0000000..b882c35
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr87022.c
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+void abort();
+char a[7];
+char b[10][7];
+char r[10][7] = { {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0},
+ {0,0,1,1,1,1,1},
+ {0,0,1,1,1,1,1},
+ {0,0,1,1,1,1,1}};
+short c;
+int d, e, f, g;
+int main() {
+ for (; d <= 4; d++) {
+ e = 0;
+ for (; e <= 6; e++) {
+ if (a[c])
+ b[e + 3][d + 2] = 1;
+ a[0] = 5;
+ b[e][d + 2] = 0;
+ }
+ }
+ for (; f < 10; f++) {
+ g = 0;
+ for (; g < 7; g++)
+ if (b[f][g] != r[f][g])
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index d8db03b..1e8a9f0 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -1921,7 +1921,8 @@ pg_add_dependence_edges (struct graph *rdg, int dir,
if (DDR_NUM_DIST_VECTS (ddr) != 1)
this_dir = 2;
/* If the overlap is exact preserve stmt order. */
- else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0), 1))
+ else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0),
+ DDR_NB_LOOPS (ddr)))
;
/* Else as the distance vector is lexicographic positive swap
the dependence direction. */