re PR fortran/46874 ([OpenMP] ICE in gfc_conv_descriptor_data_get, at fortran/trans-array.c:147)
PR fortran/46874 * trans-openmp.c (gfc_trans_omp_array_reduction): Handle allocatable dummy variables. * libgomp.fortran/allocatable6.f90: New test. From-SVN: r167798
This commit is contained in:
parent
ae9fd6b7cd
commit
af3fcdb4ac
@ -1,3 +1,9 @@
|
|||||||
|
2010-12-14 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR fortran/46874
|
||||||
|
* trans-openmp.c (gfc_trans_omp_array_reduction): Handle allocatable
|
||||||
|
dummy variables.
|
||||||
|
|
||||||
2010-12-13 Janus Weil <janus@gcc.gnu.org>
|
2010-12-13 Janus Weil <janus@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/46201
|
PR fortran/46201
|
||||||
|
@ -482,13 +482,23 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
|
|||||||
gfc_symbol init_val_sym, outer_sym, intrinsic_sym;
|
gfc_symbol init_val_sym, outer_sym, intrinsic_sym;
|
||||||
gfc_expr *e1, *e2, *e3, *e4;
|
gfc_expr *e1, *e2, *e3, *e4;
|
||||||
gfc_ref *ref;
|
gfc_ref *ref;
|
||||||
tree decl, backend_decl, stmt;
|
tree decl, backend_decl, stmt, type, outer_decl;
|
||||||
locus old_loc = gfc_current_locus;
|
locus old_loc = gfc_current_locus;
|
||||||
const char *iname;
|
const char *iname;
|
||||||
gfc_try t;
|
gfc_try t;
|
||||||
|
|
||||||
decl = OMP_CLAUSE_DECL (c);
|
decl = OMP_CLAUSE_DECL (c);
|
||||||
gfc_current_locus = where;
|
gfc_current_locus = where;
|
||||||
|
type = TREE_TYPE (decl);
|
||||||
|
outer_decl = create_tmp_var_raw (type, NULL);
|
||||||
|
if (TREE_CODE (decl) == PARM_DECL
|
||||||
|
&& TREE_CODE (type) == REFERENCE_TYPE
|
||||||
|
&& GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type))
|
||||||
|
&& GFC_TYPE_ARRAY_AKIND (TREE_TYPE (type)) == GFC_ARRAY_ALLOCATABLE)
|
||||||
|
{
|
||||||
|
decl = build_fold_indirect_ref (decl);
|
||||||
|
type = TREE_TYPE (type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a fake symbol for init value. */
|
/* Create a fake symbol for init value. */
|
||||||
memset (&init_val_sym, 0, sizeof (init_val_sym));
|
memset (&init_val_sym, 0, sizeof (init_val_sym));
|
||||||
@ -507,7 +517,9 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
|
|||||||
outer_sym.attr.dummy = 0;
|
outer_sym.attr.dummy = 0;
|
||||||
outer_sym.attr.result = 0;
|
outer_sym.attr.result = 0;
|
||||||
outer_sym.attr.flavor = FL_VARIABLE;
|
outer_sym.attr.flavor = FL_VARIABLE;
|
||||||
outer_sym.backend_decl = create_tmp_var_raw (TREE_TYPE (decl), NULL);
|
outer_sym.backend_decl = outer_decl;
|
||||||
|
if (decl != OMP_CLAUSE_DECL (c))
|
||||||
|
outer_sym.backend_decl = build_fold_indirect_ref (outer_decl);
|
||||||
|
|
||||||
/* Create fake symtrees for it. */
|
/* Create fake symtrees for it. */
|
||||||
symtree1 = gfc_new_symtree (&root1, sym->name);
|
symtree1 = gfc_new_symtree (&root1, sym->name);
|
||||||
@ -624,12 +636,12 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
|
|||||||
|
|
||||||
/* Create the init statement list. */
|
/* Create the init statement list. */
|
||||||
pushlevel (0);
|
pushlevel (0);
|
||||||
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
|
if (GFC_DESCRIPTOR_TYPE_P (type)
|
||||||
&& GFC_TYPE_ARRAY_AKIND (TREE_TYPE (decl)) == GFC_ARRAY_ALLOCATABLE)
|
&& GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
|
||||||
{
|
{
|
||||||
/* If decl is an allocatable array, it needs to be allocated
|
/* If decl is an allocatable array, it needs to be allocated
|
||||||
with the same bounds as the outer var. */
|
with the same bounds as the outer var. */
|
||||||
tree type = TREE_TYPE (decl), rank, size, esize, ptr;
|
tree rank, size, esize, ptr;
|
||||||
stmtblock_t block;
|
stmtblock_t block;
|
||||||
|
|
||||||
gfc_start_block (&block);
|
gfc_start_block (&block);
|
||||||
@ -669,8 +681,8 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
|
|||||||
|
|
||||||
/* Create the merge statement list. */
|
/* Create the merge statement list. */
|
||||||
pushlevel (0);
|
pushlevel (0);
|
||||||
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
|
if (GFC_DESCRIPTOR_TYPE_P (type)
|
||||||
&& GFC_TYPE_ARRAY_AKIND (TREE_TYPE (decl)) == GFC_ARRAY_ALLOCATABLE)
|
&& GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
|
||||||
{
|
{
|
||||||
/* If decl is an allocatable array, it needs to be deallocated
|
/* If decl is an allocatable array, it needs to be deallocated
|
||||||
afterwards. */
|
afterwards. */
|
||||||
@ -691,7 +703,7 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
|
|||||||
OMP_CLAUSE_REDUCTION_MERGE (c) = stmt;
|
OMP_CLAUSE_REDUCTION_MERGE (c) = stmt;
|
||||||
|
|
||||||
/* And stick the placeholder VAR_DECL into the clause as well. */
|
/* And stick the placeholder VAR_DECL into the clause as well. */
|
||||||
OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = outer_sym.backend_decl;
|
OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = outer_decl;
|
||||||
|
|
||||||
gfc_current_locus = old_loc;
|
gfc_current_locus = old_loc;
|
||||||
|
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2010-12-14 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR fortran/46874
|
||||||
|
* libgomp.fortran/allocatable6.f90: New test.
|
||||||
|
|
||||||
2010-12-14 Alexander Monakov <amonakov@ispras.ru>
|
2010-12-14 Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
|
||||||
PR rtl-optimization/46875
|
PR rtl-optimization/46875
|
||||||
|
45
libgomp/testsuite/libgomp.fortran/allocatable6.f90
Normal file
45
libgomp/testsuite/libgomp.fortran/allocatable6.f90
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
! PR fortran/46874
|
||||||
|
! { dg-do run }
|
||||||
|
|
||||||
|
interface
|
||||||
|
subroutine sub (a, b, c, d, n)
|
||||||
|
integer :: n
|
||||||
|
integer, allocatable :: a(:), b(:), c(:), d(:)
|
||||||
|
end subroutine
|
||||||
|
end interface
|
||||||
|
|
||||||
|
integer, allocatable :: a(:), b(:), c(:), d(:)
|
||||||
|
integer :: i, j
|
||||||
|
allocate (a(50), b(50), c(50), d(50))
|
||||||
|
do i = 1, 50
|
||||||
|
a(i) = 2 + modulo (i, 7)
|
||||||
|
b(i) = 179 - modulo (i, 11)
|
||||||
|
end do
|
||||||
|
c = 0
|
||||||
|
d = 2147483647
|
||||||
|
call sub (a, b, c, d, 50)
|
||||||
|
do i = 1, 50
|
||||||
|
j = 0
|
||||||
|
if (i .eq. 3) then
|
||||||
|
j = 8
|
||||||
|
else if (i .gt. 1 .and. i .lt. 9) then
|
||||||
|
j = 7
|
||||||
|
end if
|
||||||
|
if (c(i) .ne. j) call abort
|
||||||
|
j = 179 - modulo (i, 11)
|
||||||
|
if (i .gt. 1 .and. i .lt. 9) j = i
|
||||||
|
if (d(i) .ne. j) call abort
|
||||||
|
end do
|
||||||
|
deallocate (a, b, c, d)
|
||||||
|
end
|
||||||
|
|
||||||
|
subroutine sub (a, b, c, d, n)
|
||||||
|
integer :: n
|
||||||
|
integer, allocatable :: a(:), b(:), c(:), d(:)
|
||||||
|
!$omp parallel do shared(a, b) reduction(+:c) reduction(min:d)
|
||||||
|
do i = 1, n
|
||||||
|
c(a(i)) = c(a(i)) + 1
|
||||||
|
d(i) = min(d(i), b(i))
|
||||||
|
d(a(i)) = min(d(a(i)), a(i))
|
||||||
|
end do
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user