aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-11-08 08:44:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-11-08 08:44:02 +0000
commit2cf19e2664161d6cb1d30c937eaa0c041d955faf (patch)
treeae49cc21a76ed1db9146f92f699d9da06def4d3a /gcc
parent7d6c5039bb1030e01a66a8cf4525abff4b825276 (diff)
downloadgcc-2cf19e2664161d6cb1d30c937eaa0c041d955faf.zip
gcc-2cf19e2664161d6cb1d30c937eaa0c041d955faf.tar.gz
gcc-2cf19e2664161d6cb1d30c937eaa0c041d955faf.tar.bz2
re PR tree-optimization/59038 (r204398 causes 186.crafty init.c to be miscompiled)
2013-11-08 Richard Biener <rguenther@suse.de> PR tree-optimization/59038 PR tree-optimization/58955 * tree-loop-distribution.c (pg_add_dependence_edges): Revert previous change. Handle known dependences correctly. * gcc.dg/torture/pr59038.c: New testcase. From-SVN: r204561
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59038.c25
-rw-r--r--gcc/tree-loop-distribution.c13
3 files changed, 43 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd4715e..171032f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-11-08 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59038
+ PR tree-optimization/58955
+ * tree-loop-distribution.c (pg_add_dependence_edges): Revert
+ previous change. Handle known dependences correctly.
+
2013-11-08 Tom de Vries <tom@codesourcery.com>
* config/rs6000/t-xilinx: Remove duplicate contents.
diff --git a/gcc/testsuite/gcc.dg/torture/pr59038.c b/gcc/testsuite/gcc.dg/torture/pr59038.c
new file mode 100644
index 0000000..1694eca
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr59038.c
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+unsigned char first_ones_8bit[256];
+unsigned char connected_passed[256];
+
+int
+main ()
+{
+ int i, j;
+ for (i=0;i<256;i++){
+ connected_passed[i]=0;
+ first_ones_8bit[i]=0;
+ for (j=7;j>0;j--){
+ if ((i & (3<<(7-j))) == (3<<(7-j))){
+ connected_passed[i]=j;
+ break;
+ }
+ }
+ }
+ if (connected_passed[3] != 7)
+ abort ();
+ return 0;
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 4f9b848..45efad3 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -1324,7 +1324,7 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
{
- int this_dir = -1;
+ int this_dir = 1;
ddr_p ddr;
/* Re-shuffle data-refs to be in dominator order. */
if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
@@ -1350,8 +1350,17 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
}
/* Known dependences can still be unordered througout the
iteration space, see gcc.dg/tree-ssa/ldist-16.c. */
- if (DDR_NUM_DIST_VECTS (ddr) == 0)
+ 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
+ {
+ /* Else as the distance vector is lexicographic positive
+ swap the dependence direction. */
+ this_dir = -this_dir;
+ }
}
else
this_dir = 0;