diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd4715e2c42..171032f7a72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-11-08 Richard Biener + + 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 * 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 00000000000..1694eca4300 --- /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 4f9b848847a..45efad3f110 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 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 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;