aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-12 15:37:07 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-12 15:37:07 +0000
commitb34b273b07f29735c2db4754deef3392b5e563aa (patch)
tree867409732d7da9f11e829b7e044ff2db6b1b7063
parent88120a34aaeb91824759f238e2b227c54903ed44 (diff)
2015-01-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/64530 * tree-loop-distribution.c (pg_add_dependence_edges): Shuffle back dr1. * gfortran.dg/pr64530.f90: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219474 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr64530.f9038
-rw-r--r--gcc/tree-loop-distribution.c3
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dfba0bc433c..a1b87f602f8 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 3cda6b359a6..e0ef2911a65 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 00000000000..9805f628c83
--- /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 1b799142b03..ecd51fb788a 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;
}