re PR tree-optimization/64530 (Incorrect calculation when assigning to array with...
authorRichard Biener <rguenther@suse.de>
Mon, 12 Jan 2015 15:37:07 +0000 (15:37 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 12 Jan 2015 15:37:07 +0000 (15:37 +0000)
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.

From-SVN: r219474

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr64530.f90 [new file with mode: 0644]
gcc/tree-loop-distribution.c

index dfba0bc433cecbdbae3fc62c8bdd142175c788cf..a1b87f602f8da2bdb96e3d3b4ce448f127fd1b5f 100644 (file)
@@ -1,3 +1,9 @@
+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
index 3cda6b359a616f1ee17ad926d3b0408cdbca7475..e0ef2911a65c010da40c7434702ebc119ceaed64 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/pr64530.f90 b/gcc/testsuite/gfortran.dg/pr64530.f90
new file mode 100644 (file)
index 0000000..9805f62
--- /dev/null
@@ -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
index 1b799142b03177ac2c06c49694d1ffe38cd1d6ef..ecd51fb788a10ad6aa430419bc580e794d670157 100644 (file)
@@ -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;
 }