gfortran.h (gfc_option_t): Add flag_recursive.
authorAsher Langton <langton2@llnl.gov>
Sun, 26 Aug 2007 18:48:10 +0000 (18:48 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Sun, 26 Aug 2007 18:48:10 +0000 (20:48 +0200)
2007-08-26  Asher Langton  <langton2@llnl.gov>
    Tobias Burnus  <burnus@net-b.de>

        * gfortran.h (gfc_option_t): Add flag_recursive.
* lang.opt: Add -frecursive option and update -fopenmp.
* invoke.texi (-frecursive): Document new option.
(-fopenmp,-fno-automatic,-fmax-stack-var-size): Update.
* options.c (gfc_init_options, gfc_post_options,
gfc_handle_option): Add -frecursive and modify -fopenmp.
(gfc_post_options): Add warning for conflicting flags.

2007-08-26  Asher Langton  <langton2@llnl.gov>

* gfortran.dg/recursive_stack.f90: New.
* gfortran.dg/openmp_stack.f90: New.

Co-Authored-By: Tobias Burnus <burnus@net-b.de>
From-SVN: r127813

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/invoke.texi
gcc/fortran/lang.opt
gcc/fortran/options.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/openmp_stack.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/recursive_stack.f90 [new file with mode: 0644]

index 81d7bddd56d09c558193e0d92cccf7df13bcc93a..903b713054be1eef7ecb38efd6f03e67e3a9372b 100644 (file)
@@ -1,3 +1,14 @@
+2007-08-26  Asher Langton  <langton2@llnl.gov>
+           Tobias Burnus  <burnus@net-b.de>
+
+       * gfortran.h (gfc_option_t): Add flag_recursive.
+       * lang.opt: Add -frecursive option and update -fopenmp.
+       * invoke.texi (-frecursive): Document new option.
+       (-fopenmp,-fno-automatic,-fmax-stack-var-size): Update.
+       * options.c (gfc_init_options, gfc_post_options,
+       gfc_handle_option): Add -frecursive and modify -fopenmp.
+       (gfc_post_options): Add warning for conflicting flags.
+
 2007-08-26  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/31298
index 11d7adce8f72c09271f21c9bda7731ac1aba05df..383270e603affdb245a10aff6334cafc64497cec 100644 (file)
@@ -1863,6 +1863,7 @@ typedef struct
   int flag_openmp;
   int flag_sign_zero;
   int flag_module_private;
+  int flag_recursive;
 
   int fpe;
 
index c68a2613960da3eadcc52b08c1dc0e92910d450d..e58cb8cbee76f3d926b236590b9ea5b722f0bd10 100644 (file)
@@ -156,7 +156,7 @@ and warnings}.
 -fsecond-underscore @gol
 -fbounds-check  -fmax-stack-var-size=@var{n} @gol
 -fpack-derived  -frepack-arrays  -fshort-enums  -fexternal-blas @gol
--fblas-matmul-limit=@var{n}}
+-fblas-matmul-limit=@var{n} -frecursive}
 @end table
 
 @menu
@@ -296,7 +296,7 @@ and @code{c$omp}, @code{*$omp} and @code{!$omp} directives in fixed form,
 @code{!$} conditional compilation sentinels in free form
 and @code{c$}, @code{*$} and @code{!$} sentinels in fixed form, 
 and when linking arranges for the OpenMP runtime library to be linked
-in.
+in.  The option @option{-fopenmp} implies @option{-frecursive}.
 
 @item -frange-check
 @opindex @code{frange-check}
@@ -710,10 +710,13 @@ it.
 @opindex @code{fno-automatic}
 @cindex @code{SAVE} statement
 @cindex statement, @code{SAVE}
-Treat each program unit as if the @code{SAVE} statement was specified for
-every local variable and array referenced in it. Does not affect common
-blocks. (Some Fortran compilers provide this option under the name
-@option{-static}.)
+Treat each program unit (except those marked as RECURSIVE) as if the
+@code{SAVE} statement were specified for every local variable and array
+referenced in it. Does not affect common blocks. (Some Fortran compilers
+provide this option under the name @option{-static} or @option{-save}.)
+The default, which is @option{-fautomatic}, uses the stack for local
+variables smaller than the value given by @option{-fmax-stack-var-size}.
+Use the option @option{-frecursive} to use no static memory. 
 
 @item -ff2c
 @opindex ff2c
@@ -865,7 +868,10 @@ substring references.
 @item -fmax-stack-var-size=@var{n}
 @opindex @code{fmax-stack-var-size}
 This option specifies the size in bytes of the largest array that will be put
-on the stack.
+on the stack; if the size is exceeded static memory is used (except in
+procedures marked as RECURSIVE). Use the option @option{-frecursive} to
+allow for recursive procedures which do not have a RECURSIVE attribute or
+for parallel programs. Use @option{-fno-automatic} to never use the stack.
 
 This option currently only affects local arrays declared with constant
 bounds, and may not apply to all character variables.
@@ -919,6 +925,12 @@ geometric mean of the dimensions of the argument and result matrices.
 
 The default value for @var{n} is 30.
 
+@item -frecursive
+@opindex @code{frecursive}
+Allow indirect recursion by forcing all local arrays to be allocated
+on the stack. This flag cannot be used together with
+@option{-fmax-stack-var-size=} or @option{-fno-automatic}.
+
 @end table
 
 @xref{Code Gen Options,,Options for Code Generation Conventions,
index 3072051a1f4a5007214d065e60be96e2a96d23c7..558cf657aac5bae608e4b5bef1037f0af3edbb3c 100644 (file)
@@ -218,7 +218,7 @@ Set default accessibility of module entities to PRIVATE.
 
 fopenmp
 Fortran
-Enable OpenMP
+Enable OpenMP (also sets frecursive)
 
 fpack-derived
 Fortran
@@ -240,6 +240,10 @@ frecord-marker=8
 Fortran RejectNegative
 Use an 8-byte record marker for unformatted files
 
+frecursive
+Fortran
+Allocate local variables on the stack to allow indirect recursion
+
 frepack-arrays
 Fortran
 Copy array sections into a contiguous block on procedure entry
index 0bea67d7eeac8c4887e4184faa1ed600721111e8..3ab736236be29ded8cf89fb026f99550160e5576 100644 (file)
@@ -86,7 +86,10 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
   gfc_option.flag_f2c = 0;
   gfc_option.flag_second_underscore = -1;
   gfc_option.flag_implicit_none = 0;
-  gfc_option.flag_max_stack_var_size = 32768;
+
+  /* Default value of flag_max_stack_var_size is set in gfc_post_options.  */
+  gfc_option.flag_max_stack_var_size = -2;
+
   gfc_option.flag_range_check = 1;
   gfc_option.flag_pack_derived = 0;
   gfc_option.flag_repack_arrays = 0;
@@ -103,6 +106,7 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
   gfc_option.flag_d_lines = -1;
   gfc_option.flag_openmp = 0;
   gfc_option.flag_sign_zero = 1;
+  gfc_option.flag_recursive = 0;
 
   gfc_option.fpe = 0;
 
@@ -290,6 +294,37 @@ gfc_post_options (const char **pfilename)
   if (gfc_option.flag_second_underscore == -1)
     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
 
+  if (!gfc_option.flag_automatic && gfc_option.flag_max_stack_var_size != -2
+      && gfc_option.flag_max_stack_var_size != 0)
+    gfc_warning_now ("Flag -fno-automatic overwrites -fmax-stack-var-size=%d",
+                    gfc_option.flag_max_stack_var_size);
+  else if (!gfc_option.flag_automatic && gfc_option.flag_recursive)
+    gfc_warning_now ("Flag -fno-automatic overwrites -frecursive");
+  else if (!gfc_option.flag_automatic && gfc_option.flag_openmp)
+    gfc_warning_now ("Flag -fno-automatic overwrites -frecursive implied by "
+                    "-fopenmp");
+  else if (gfc_option.flag_max_stack_var_size != -2
+          && gfc_option.flag_recursive)
+    gfc_warning_now ("Flag -frecursive overwrites -fmax-stack-var-size=%d",
+                    gfc_option.flag_max_stack_var_size);
+  else if (gfc_option.flag_max_stack_var_size != -2
+          && gfc_option.flag_openmp)
+    gfc_warning_now ("Flag -fmax-stack-var-size=%d overwrites -frecursive "
+                    "implied by -fopenmp", 
+                    gfc_option.flag_max_stack_var_size);
+
+  /* Implied -frecursive; implemented as -fmax-stack-var-size=-1.  */
+  if (gfc_option.flag_max_stack_var_size == -2 && gfc_option.flag_openmp)
+    gfc_option.flag_max_stack_var_size = -1;
+
+  /* Set default.  */
+  if (gfc_option.flag_max_stack_var_size == -2)
+    gfc_option.flag_max_stack_var_size = 32768;
+
+  /* Implement -frecursive as -fmax-stack-var-size=-1.  */
+  if (gfc_option.flag_recursive)
+    gfc_option.flag_max_stack_var_size = -1;
+
   /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
   if (!gfc_option.flag_automatic)
     gfc_option.flag_max_stack_var_size = 0;
@@ -698,6 +733,11 @@ gfc_handle_option (size_t scode, const char *arg, int value)
                         MAX_SUBRECORD_LENGTH);
 
       gfc_option.max_subrecord_length = value;
+      break;
+
+    case OPT_frecursive:
+      gfc_option.flag_recursive = 1;
+      break;
     }
 
   return result;
index 43875beb80f1f726a7dad3b2394cb6bd618cf27c..d0be7eeb4e5bfa2b1cb24c4683cbce54c0f4c274 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-26  Asher Langton  <langton2@llnl.gov>
+
+       * gfortran.dg/recursive_stack.f90: New.
+       * gfortran.dg/openmp_stack.f90: New.
+
 2007-08-26  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/31298
diff --git a/gcc/testsuite/gfortran.dg/openmp_stack.f90 b/gcc/testsuite/gfortran.dg/openmp_stack.f90
new file mode 100644 (file)
index 0000000..97dd915
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do run}
+! { dg-options "-fopenmp" }
+program openmp_stack
+  implicit none
+  integer id
+  integer ilocs(2)
+  integer omp_get_thread_num, foo
+  call omp_set_num_threads (2)
+!$omp parallel private (id)
+  id = omp_get_thread_num() + 1
+  ilocs(id) = foo()
+!$omp end parallel
+  ! Check that the two threads are not sharing a location for
+  ! the array x in foo()
+  if (ilocs(1) .eq. ilocs(2)) call abort
+end program openmp_stack
+
+integer function foo ()
+  implicit none
+  real x(100,100)
+  foo = loc(x)
+end function foo
diff --git a/gcc/testsuite/gfortran.dg/recursive_stack.f90 b/gcc/testsuite/gfortran.dg/recursive_stack.f90
new file mode 100644 (file)
index 0000000..7dbe9fc
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do run}
+! { dg-options "-frecursive" }
+program recursive_stack
+  call foo (.true.)
+end program recursive_stack
+
+subroutine foo (recurse)
+  logical recurse
+  integer iarray(100,100)
+  if (recurse) then
+     iarray(49,49) = 17
+     call bar
+     if (iarray(49,49) .ne. 17) call abort
+  else
+     iarray(49,49) = 21
+  end if
+end subroutine foo
+
+subroutine bar
+  call foo (.false.)
+end subroutine bar