re PR fortran/57798 (Incorrect handling of sum over first dimension of a product...
authorMikael Morin <mikael@gcc.gnu.org>
Fri, 23 Aug 2013 17:49:39 +0000 (17:49 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Fri, 23 Aug 2013 17:49:39 +0000 (17:49 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/inline_sum_5.f90 [new file with mode: 0644]

index 35f970ead81c4d8156eea8107e46dfc578e35e26..e804749727d2afadd2732a49da6ae68af164bb78 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR fortran/57843
index a626d66b7d8f221dd27f9d2ebbd791082a8441d6..5a3cf80f9f644da484d3b2783407f148e17c5fe4 100644 (file)
@@ -3776,6 +3776,8 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop)
   gfc_ss *ss;
   tree desc;
 
+  gfc_loopinfo * const outer_loop = outermost_loop (loop);
+
   loop->dimen = 0;
   /* Determine the rank of the loop.  */
   for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
@@ -3835,10 +3837,11 @@ done:
          /* Get the descriptor for the array.  If it is a cross loops array,
             we got the descriptor already in the outermost loop.  */
          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++)
-           gfc_conv_section_startstride (&loop->pre, ss, ss->dim[n]);
+           gfc_conv_section_startstride (&outer_loop->pre, ss, ss->dim[n]);
          break;
 
        case GFC_SS_INTRINSIC:
@@ -3874,7 +3877,7 @@ done:
                                           fold_convert (gfc_array_index_type,
                                                         rank),
                                           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->stride[0] = gfc_index_one_node;
                    continue;
@@ -4156,7 +4159,7 @@ done:
        }
 
       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)
@@ -4439,6 +4442,8 @@ set_loop_bounds (gfc_loopinfo *loop)
   mpz_t i;
   bool nonoptional_arr;
 
+  gfc_loopinfo * const outer_loop = outermost_loop (loop);
+
   loopspec = loop->specloop;
 
   mpz_init (i);
@@ -4627,7 +4632,7 @@ set_loop_bounds (gfc_loopinfo *loop)
       else
        {
          /* 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.
             with start = 0, this simplifies to
             last = end / step;
@@ -4639,7 +4644,7 @@ set_loop_bounds (gfc_loopinfo *loop)
                                 gfc_array_index_type, tmp, info->stride[dim]);
          tmp = fold_build2_loc (input_location, MAX_EXPR, gfc_array_index_type,
                                 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.  */
          loop->from[n] = gfc_index_zero_node;
        }
@@ -4715,6 +4720,8 @@ gfc_set_delta (gfc_loopinfo *loop)
   tree tmp;
   int n, dim;
 
+  gfc_loopinfo * const outer_loop = outermost_loop (loop);
+
   loopspec = loop->specloop;
 
   /* Calculate the translation from loop variables to array indices.  */
@@ -4750,7 +4757,7 @@ gfc_set_delta (gfc_loopinfo *loop)
                                     gfc_array_index_type,
                                     info->start[dim], tmp);
 
-             info->delta[dim] = gfc_evaluate_now (tmp, &loop->pre);
+             info->delta[dim] = gfc_evaluate_now (tmp, &outer_loop->pre);
            }
        }
     }
index 5d9c3bb70c8eea8b8c71029a548829b7fd502f3e..f8efd687233d9fb3b89741a2ec960edf6d5a6972 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR fortran/57843
diff --git a/gcc/testsuite/gfortran.dg/inline_sum_5.f90 b/gcc/testsuite/gfortran.dg/inline_sum_5.f90
new file mode 100644 (file)
index 0000000..bda73fd
--- /dev/null
@@ -0,0 +1,33 @@
+! { 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
+