diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr64530.f90 | 38 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 3 |
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dfba0bc..a1b87f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2015-01-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/64530 + * tree-loop-distribution.c (pg_add_dependence_edges): Shuffle + back dr1. + +2015-01-12 Richard Biener <rguenther@suse.de> + PR middle-end/64357 * tree-cfg.c (gimple_can_merge_blocks_p): Protect simple latches properly. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3cda6b3..e0ef291 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2015-01-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/64530 + * gfortran.dg/pr64530.f90: New testcase. + +2015-01-12 Richard Biener <rguenther@suse.de> + PR middle-end/64357 * gcc.dg/torture/pr64357.c: New testcase. diff --git a/gcc/testsuite/gfortran.dg/pr64530.f90 b/gcc/testsuite/gfortran.dg/pr64530.f90 new file mode 100644 index 0000000..9805f62 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr64530.f90 @@ -0,0 +1,38 @@ +! { dg-do run } + +program bug + ! Bug triggered with at least three elements + integer, parameter :: asize = 3 + + double precision,save :: ave(asize) + double precision,save :: old(asize) + double precision,save :: tmp(asize) + + ave(:) = 10.d0 + old(:) = 3.d0 + tmp(:) = 0.d0 + + call buggy(2.d0,asize,ave,old,tmp) + if (any (tmp(:) .ne. 3.5)) call abort +end + +subroutine buggy(scale_factor, asize, ave, old, tmp) + + implicit none + ! Args + double precision scale_factor + integer asize + double precision ave(asize) + double precision old(asize) + double precision tmp(asize) + + ! Local + integer i + + do i = 1, asize + tmp(i) = ave(i) - old(i) + old(i) = ave(i) + tmp(i) = tmp(i) / scale_factor + end do + +end subroutine buggy diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 1b79914..ecd51fb 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1362,6 +1362,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) { + data_reference_p saved_dr1 = dr1; int this_dir = 1; ddr_p ddr; /* Re-shuffle data-refs to be in dominator order. */ @@ -1407,6 +1408,8 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir, dir = this_dir; else if (dir != this_dir) return 2; + /* Shuffle "back" dr1. */ + dr1 = saved_dr1; } return dir; } |