re PR fortran/63938 (OpenMP atomic update does not protect access to automatic array)
PR fortran/63938 * trans-openmp.c (gfc_trans_omp_atomic): Make sure lhsaddr is simple enough for goa_lhs_expr_p. * libgomp.fortran/pr63938-1.f90: New test. * libgomp.fortran/pr63938-2.f90: New test. From-SVN: r218031
This commit is contained in:
parent
05e729ec76
commit
3f9e8f13a3
5 changed files with 56 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2014-11-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR fortran/63938
|
||||
* trans-openmp.c (gfc_trans_omp_atomic): Make sure lhsaddr is
|
||||
simple enough for goa_lhs_expr_p.
|
||||
|
||||
2014-11-24 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
* error.c (gfc_fatal_error_1): Remove.
|
||||
|
|
|
@ -2683,6 +2683,18 @@ gfc_trans_omp_atomic (gfc_code *code)
|
|||
}
|
||||
|
||||
lhsaddr = save_expr (lhsaddr);
|
||||
if (TREE_CODE (lhsaddr) != SAVE_EXPR
|
||||
&& (TREE_CODE (lhsaddr) != ADDR_EXPR
|
||||
|| TREE_CODE (TREE_OPERAND (lhsaddr, 0)) != VAR_DECL))
|
||||
{
|
||||
/* Make sure LHS is simple enough so that goa_lhs_expr_p can recognize
|
||||
it even after unsharing function body. */
|
||||
tree var = create_tmp_var_raw (TREE_TYPE (lhsaddr), NULL);
|
||||
DECL_CONTEXT (var) = current_function_decl;
|
||||
lhsaddr = build4 (TARGET_EXPR, TREE_TYPE (lhsaddr), var, lhsaddr,
|
||||
NULL_TREE, NULL_TREE);
|
||||
}
|
||||
|
||||
rhs = gfc_evaluate_now (rse.expr, &block);
|
||||
|
||||
if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2014-11-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR fortran/63938
|
||||
* libgomp.fortran/pr63938-1.f90: New test.
|
||||
* libgomp.fortran/pr63938-2.f90: New test.
|
||||
|
||||
2014-11-21 Steve Ellcey <sellcey@imgtec.com>
|
||||
|
||||
* config/linux/mips/futex.h (SYS_futex): Define if not already done.
|
||||
|
|
14
libgomp/testsuite/libgomp.fortran/pr63938-1.f90
Normal file
14
libgomp/testsuite/libgomp.fortran/pr63938-1.f90
Normal file
|
@ -0,0 +1,14 @@
|
|||
! PR fortran/63938
|
||||
! { dg-do run }
|
||||
|
||||
program pr63938_1
|
||||
integer :: i, x(1)
|
||||
x(1) = 0
|
||||
!$omp parallel do
|
||||
do i = 1, 1000
|
||||
!$omp atomic
|
||||
x(1) = x(1) + 1
|
||||
end do
|
||||
!$omp end parallel do
|
||||
if (x(1) .ne. 1000) call abort
|
||||
end program pr63938_1
|
18
libgomp/testsuite/libgomp.fortran/pr63938-2.f90
Normal file
18
libgomp/testsuite/libgomp.fortran/pr63938-2.f90
Normal file
|
@ -0,0 +1,18 @@
|
|||
! PR fortran/63938
|
||||
! { dg-do run }
|
||||
|
||||
program pr63938_2
|
||||
type t
|
||||
integer :: x
|
||||
end type
|
||||
integer :: i
|
||||
type(t) :: x
|
||||
x%x = 0
|
||||
!$omp parallel do
|
||||
do i = 1, 1000
|
||||
!$omp atomic
|
||||
x%x = x%x + 1
|
||||
end do
|
||||
!$omp end parallel do
|
||||
if (x%x .ne. 1000) call abort
|
||||
end program pr63938_2
|
Loading…
Add table
Reference in a new issue