Commit 1f65468a by Mikael Morin

re PR fortran/57798 (Incorrect handling of sum over first dimension of a product…

re PR fortran/57798 (Incorrect handling of sum over first dimension of a product of automatic arrays)

fortran/
	PR fortran/57798
	* trans-array.c (gfc_conv_ss_startstride, set_loop_bounds,
	gfc_set_delta): Generate preliminary code before the outermost loop.

testsuite/
	PR fortran/57798
	* gfortran.dg/inline_sum_5.f90: New.

From-SVN: r201947
parent 4f7395ff
2013-08-23 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/57798
* trans-array.c (gfc_conv_ss_startstride, set_loop_bounds,
gfc_set_delta): Generate preliminary code before the outermost loop.
2013-08-23 Janus Weil <janus@gcc.gnu.org> 2013-08-23 Janus Weil <janus@gcc.gnu.org>
PR fortran/57843 PR fortran/57843
......
...@@ -3776,6 +3776,8 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop) ...@@ -3776,6 +3776,8 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop)
gfc_ss *ss; gfc_ss *ss;
tree desc; tree desc;
gfc_loopinfo * const outer_loop = outermost_loop (loop);
loop->dimen = 0; loop->dimen = 0;
/* Determine the rank of the loop. */ /* Determine the rank of the loop. */
for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain) for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
...@@ -3835,10 +3837,11 @@ done: ...@@ -3835,10 +3837,11 @@ done:
/* Get the descriptor for the array. If it is a cross loops array, /* Get the descriptor for the array. If it is a cross loops array,
we got the descriptor already in the outermost loop. */ we got the descriptor already in the outermost loop. */
if (ss->parent == NULL) if (ss->parent == NULL)
gfc_conv_ss_descriptor (&loop->pre, ss, !loop->array_parameter); gfc_conv_ss_descriptor (&outer_loop->pre, ss,
!loop->array_parameter);
for (n = 0; n < ss->dimen; n++) for (n = 0; n < ss->dimen; n++)
gfc_conv_section_startstride (&loop->pre, ss, ss->dim[n]); gfc_conv_section_startstride (&outer_loop->pre, ss, ss->dim[n]);
break; break;
case GFC_SS_INTRINSIC: case GFC_SS_INTRINSIC:
...@@ -3874,7 +3877,7 @@ done: ...@@ -3874,7 +3877,7 @@ done:
fold_convert (gfc_array_index_type, fold_convert (gfc_array_index_type,
rank), rank),
gfc_index_one_node); gfc_index_one_node);
info->end[0] = gfc_evaluate_now (tmp, &loop->pre); info->end[0] = gfc_evaluate_now (tmp, &outer_loop->pre);
info->start[0] = gfc_index_zero_node; info->start[0] = gfc_index_zero_node;
info->stride[0] = gfc_index_one_node; info->stride[0] = gfc_index_one_node;
continue; continue;
...@@ -4156,7 +4159,7 @@ done: ...@@ -4156,7 +4159,7 @@ done:
} }
tmp = gfc_finish_block (&block); tmp = gfc_finish_block (&block);
gfc_add_expr_to_block (&loop->pre, tmp); gfc_add_expr_to_block (&outer_loop->pre, tmp);
} }
for (loop = loop->nested; loop; loop = loop->next) for (loop = loop->nested; loop; loop = loop->next)
...@@ -4439,6 +4442,8 @@ set_loop_bounds (gfc_loopinfo *loop) ...@@ -4439,6 +4442,8 @@ set_loop_bounds (gfc_loopinfo *loop)
mpz_t i; mpz_t i;
bool nonoptional_arr; bool nonoptional_arr;
gfc_loopinfo * const outer_loop = outermost_loop (loop);
loopspec = loop->specloop; loopspec = loop->specloop;
mpz_init (i); mpz_init (i);
...@@ -4627,7 +4632,7 @@ set_loop_bounds (gfc_loopinfo *loop) ...@@ -4627,7 +4632,7 @@ set_loop_bounds (gfc_loopinfo *loop)
else else
{ {
/* Set the delta for this section. */ /* Set the delta for this section. */
info->delta[dim] = gfc_evaluate_now (loop->from[n], &loop->pre); info->delta[dim] = gfc_evaluate_now (loop->from[n], &outer_loop->pre);
/* Number of iterations is (end - start + step) / step. /* Number of iterations is (end - start + step) / step.
with start = 0, this simplifies to with start = 0, this simplifies to
last = end / step; last = end / step;
...@@ -4639,7 +4644,7 @@ set_loop_bounds (gfc_loopinfo *loop) ...@@ -4639,7 +4644,7 @@ set_loop_bounds (gfc_loopinfo *loop)
gfc_array_index_type, tmp, info->stride[dim]); gfc_array_index_type, tmp, info->stride[dim]);
tmp = fold_build2_loc (input_location, MAX_EXPR, gfc_array_index_type, tmp = fold_build2_loc (input_location, MAX_EXPR, gfc_array_index_type,
tmp, build_int_cst (gfc_array_index_type, -1)); tmp, build_int_cst (gfc_array_index_type, -1));
loop->to[n] = gfc_evaluate_now (tmp, &loop->pre); loop->to[n] = gfc_evaluate_now (tmp, &outer_loop->pre);
/* Make the loop variable start at 0. */ /* Make the loop variable start at 0. */
loop->from[n] = gfc_index_zero_node; loop->from[n] = gfc_index_zero_node;
} }
...@@ -4715,6 +4720,8 @@ gfc_set_delta (gfc_loopinfo *loop) ...@@ -4715,6 +4720,8 @@ gfc_set_delta (gfc_loopinfo *loop)
tree tmp; tree tmp;
int n, dim; int n, dim;
gfc_loopinfo * const outer_loop = outermost_loop (loop);
loopspec = loop->specloop; loopspec = loop->specloop;
/* Calculate the translation from loop variables to array indices. */ /* Calculate the translation from loop variables to array indices. */
...@@ -4750,7 +4757,7 @@ gfc_set_delta (gfc_loopinfo *loop) ...@@ -4750,7 +4757,7 @@ gfc_set_delta (gfc_loopinfo *loop)
gfc_array_index_type, gfc_array_index_type,
info->start[dim], tmp); info->start[dim], tmp);
info->delta[dim] = gfc_evaluate_now (tmp, &loop->pre); info->delta[dim] = gfc_evaluate_now (tmp, &outer_loop->pre);
} }
} }
} }
......
2013-08-23 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/57798
* gfortran.dg/inline_sum_5.f90: New.
2013-08-23 Janus Weil <janus@gcc.gnu.org> 2013-08-23 Janus Weil <janus@gcc.gnu.org>
PR fortran/57843 PR fortran/57843
......
! { dg-do run }
!
! PR fortran/57798
! The call to sum used to be inlined into a loop with an uninitialized bound
!
! Original testcase by Stephan Kramer <stephan.kramer@imperial.ac.uk>
program test
implicit none
call sub(2, 11)
contains
function func(m, n)
integer, intent(in):: m,n
real, dimension(m, n):: func
func = 1.0
end function func
subroutine sub(m, n)
integer, intent(in):: m, n
real, dimension(m,n):: y
y = 1.0
if (any(sum(y*func(m,n), dim=1) /= m)) call abort
end subroutine sub
end program test
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment