diff options
author | Richard Biener <rguenther@suse.de> | 2013-11-08 08:44:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-11-08 08:44:02 +0000 |
commit | 2cf19e2664161d6cb1d30c937eaa0c041d955faf (patch) | |
tree | ae49cc21a76ed1db9146f92f699d9da06def4d3a /gcc | |
parent | 7d6c5039bb1030e01a66a8cf4525abff4b825276 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr59038.c | 25 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 13 |
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; |