re PR tree-optimization/64530 (Incorrect calculation when assigning to array with -O3)

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
This commit is contained in:
Richard Biener 2015-01-12 15:37:07 +00:00 committed by Richard Biener
parent 2a58c80212
commit 62e22fcb79
4 changed files with 52 additions and 0 deletions

View 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

View 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

View file

@ -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

View 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;
}