From cd75853e1d1279a99afc0e5dc46b30edca64e6f4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 9 Jun 2006 23:18:42 +0200 Subject: [PATCH] re PR fortran/27916 (Problem with allocatable arrays inside OpenMP do loop) PR fortran/27916 * trans-openmp.c (gfc_omp_clause_default_ctor): New function. * trans.h (gfc_omp_clause_default_ctor): New prototype. * f95-lang.c (LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR): Define. * testsuite/libgomp.fortran/pr27916-1.f90: New test. * testsuite/libgomp.fortran/pr27916-2.f90: New test. From-SVN: r114520 --- gcc/fortran/ChangeLog | 7 +++++ gcc/fortran/f95-lang.c | 2 ++ gcc/fortran/trans-openmp.c | 23 ++++++++++++++++ gcc/fortran/trans.h | 1 + libgomp/ChangeLog | 6 +++++ .../testsuite/libgomp.fortran/pr27916-1.f90 | 26 +++++++++++++++++++ .../testsuite/libgomp.fortran/pr27916-2.f90 | 26 +++++++++++++++++++ 7 files changed, 91 insertions(+) create mode 100644 libgomp/testsuite/libgomp.fortran/pr27916-1.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/pr27916-2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0a3d2c12bee..a576a2e35dd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2006-06-09 Jakub Jelinek + + PR fortran/27916 + * trans-openmp.c (gfc_omp_clause_default_ctor): New function. + * trans.h (gfc_omp_clause_default_ctor): New prototype. + * f95-lang.c (LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR): Define. + 2006-06-08 Francois-Xavier Coudert PR fortran/27958 diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c index 72579246515..6dc00da63a3 100644 --- a/gcc/fortran/f95-lang.c +++ b/gcc/fortran/f95-lang.c @@ -120,6 +120,7 @@ static HOST_WIDE_INT gfc_get_alias_set (tree); #undef LANG_HOOKS_GET_ALIAS_SET #undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE #undef LANG_HOOKS_OMP_PREDETERMINED_SHARING +#undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR #undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR #undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE #undef LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES @@ -144,6 +145,7 @@ static HOST_WIDE_INT gfc_get_alias_set (tree); #define LANG_HOOKS_GET_ALIAS_SET gfc_get_alias_set #define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE gfc_omp_privatize_by_reference #define LANG_HOOKS_OMP_PREDETERMINED_SHARING gfc_omp_predetermined_sharing +#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR gfc_omp_clause_default_ctor #define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR gfc_omp_disregard_value_expr #define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE gfc_omp_private_debug_clause #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \ diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index b7c6f9e3bfb..76124acfc30 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -94,6 +94,29 @@ gfc_omp_predetermined_sharing (tree decl) return OMP_CLAUSE_DEFAULT_UNSPECIFIED; } + +/* Return code to initialize DECL with its default constructor, or + NULL if there's nothing to do. */ + +tree +gfc_omp_clause_default_ctor (tree clause ATTRIBUTE_UNUSED, tree decl) +{ + tree type = TREE_TYPE (decl); + stmtblock_t block; + + if (! GFC_DESCRIPTOR_TYPE_P (type)) + return NULL; + + /* Allocatable arrays in PRIVATE clauses need to be set to + "not currently allocated" allocation status. */ + gfc_init_block (&block); + + gfc_conv_descriptor_data_set (&block, decl, null_pointer_node); + + return gfc_finish_block (&block); +} + + /* Return true if DECL's DECL_VALUE_EXPR (if any) should be disregarded in OpenMP construct, because it is going to be remapped during OpenMP lowering. SHARED is true if DECL diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 738ed0261bd..ce997932bf6 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -451,6 +451,7 @@ tree builtin_function (const char *, tree, int, enum built_in_class, /* In trans-openmp.c */ bool gfc_omp_privatize_by_reference (tree); enum omp_clause_default_kind gfc_omp_predetermined_sharing (tree); +tree gfc_omp_clause_default_ctor (tree, tree); bool gfc_omp_disregard_value_expr (tree, bool); bool gfc_omp_private_debug_clause (tree, bool); struct gimplify_omp_ctx; diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 8ce2c1a6a70..07d0ff3376d 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,9 @@ +2006-06-09 Jakub Jelinek + + PR fortran/27916 + * testsuite/libgomp.fortran/pr27916-1.f90: New test. + * testsuite/libgomp.fortran/pr27916-2.f90: New test. + 2006-06-06 Francois-Xavier Coudert * config/mingw32/time.c: New file. diff --git a/libgomp/testsuite/libgomp.fortran/pr27916-1.f90 b/libgomp/testsuite/libgomp.fortran/pr27916-1.f90 new file mode 100644 index 00000000000..7f6b51d0892 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr27916-1.f90 @@ -0,0 +1,26 @@ +! PR fortran/27916 +! Test whether allocatable privatized arrays has "not currently allocated" +! status at the start of OpenMP constructs. +! { dg-do run } + +program pr27916 + integer :: n, i + logical :: r + integer, dimension(:), allocatable :: a + + r = .false. +!$omp parallel do num_threads (4) private (n, a, i) & +!$omp & reduction (.or.: r) schedule (static) + do n = 1, 16 + r = r .or. allocated (a) + allocate (a (16)) + r = r .or. .not. allocated (a) + do i = 1, 16 + a (i) = i + end do + deallocate (a) + r = r .or. allocated (a) + end do + !$omp end parallel do + if (r) call abort +end program pr27916 diff --git a/libgomp/testsuite/libgomp.fortran/pr27916-2.f90 b/libgomp/testsuite/libgomp.fortran/pr27916-2.f90 new file mode 100644 index 00000000000..aa8bb0aec62 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr27916-2.f90 @@ -0,0 +1,26 @@ +! PR fortran/27916 +! Test whether allocatable privatized arrays has "not currently allocated" +! status at the start of OpenMP constructs. +! { dg-do run } + +program pr27916 + integer :: n, i + logical :: r + integer, dimension(:), allocatable :: a + + r = .false. +!$omp parallel do num_threads (4) default (private) & +!$omp & reduction (.or.: r) schedule (static) + do n = 1, 16 + r = r .or. allocated (a) + allocate (a (16)) + r = r .or. .not. allocated (a) + do i = 1, 16 + a (i) = i + end do + deallocate (a) + r = r .or. allocated (a) + end do + !$omp end parallel do + if (r) call abort +end program pr27916