2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-24 22:51:08 +08:00

re PR tree-optimization/57396 (Wrong code with -fpredictive-commoning in Fortran double-loop)

2013-05-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/57396
	* tree-affine.c (double_int_constant_multiple_p): Properly
	return false for val == 0 and div != 0.

	* gfortran.fortran-torture/execute/pr57396.f90: New testcase.

From-SVN: r199350
This commit is contained in:
Richard Biener 2013-05-27 07:48:37 +00:00 committed by Richard Biener
parent f631c26698
commit b03be25f05
4 changed files with 55 additions and 6 deletions
gcc
ChangeLog
testsuite
ChangeLog
gfortran.fortran-torture/execute
tree-affine.c

@ -1,3 +1,9 @@
2013-05-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/57396
* tree-affine.c (double_int_constant_multiple_p): Properly
return false for val == 0 and div != 0.
2013-05-25 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.h: Use #elif in preprocessor conditions.

@ -1,3 +1,8 @@
2013-05-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/57396
* gfortran.fortran-torture/execute/pr57396.f90: New testcase.
2013-05-26 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/last_bit.ads: New test.

@ -0,0 +1,33 @@
module testmod
implicit none
contains
subroutine foo(n)
integer, intent(in) :: n
real :: r(0:n,-n:n), a(0:n,-n:n), dj
integer :: k, j
! initialize with some dummy values
do j = -n, n
a(:, j) = j
r(:,j) = j + 1
end do
! here be dragons
do k = 0, n
dj = r(k, k - 2) * a(k, k - 2)
r(k,k) = a(k, k - 1) * dj
enddo
if (r(0,0) .ne. -2.) call abort
end subroutine
end module
program test
use testmod
implicit none
call foo(5)
end program

@ -736,11 +736,10 @@ free_affine_expand_cache (struct pointer_map_t **cache)
}
/* If VAL != CST * DIV for any constant CST, returns false.
Otherwise, if VAL != 0 (and hence CST != 0), and *MULT_SET is true,
additionally compares CST and MULT, and if they are different,
returns false. Finally, if neither of these two cases occur,
true is returned, and if CST != 0, CST is stored to MULT and
MULT_SET is set to true. */
Otherwise, if *MULT_SET is true, additionally compares CST and MULT,
and if they are different, returns false. Finally, if neither of these
two cases occur, true is returned, and CST is stored to MULT and MULT_SET
is set to true. */
static bool
double_int_constant_multiple_p (double_int val, double_int div,
@ -749,7 +748,13 @@ double_int_constant_multiple_p (double_int val, double_int div,
double_int rem, cst;
if (val.is_zero ())
return true;
{
if (*mult_set && !mult->is_zero ())
return false;
*mult_set = true;
*mult = double_int_zero;
return true;
}
if (div.is_zero ())
return false;