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/tree-loop-distribution.c | |
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/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 13 |
1 files changed, 11 insertions, 2 deletions
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; |