mirror of git://gcc.gnu.org/git/gcc.git
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
|
|
@ -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>
|
2014-11-24 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
* error.c (gfc_fatal_error_1): Remove.
|
* error.c (gfc_fatal_error_1): Remove.
|
||||||
|
|
|
||||||
|
|
@ -2683,6 +2683,18 @@ gfc_trans_omp_atomic (gfc_code *code)
|
||||||
}
|
}
|
||||||
|
|
||||||
lhsaddr = save_expr (lhsaddr);
|
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);
|
rhs = gfc_evaluate_now (rse.expr, &block);
|
||||||
|
|
||||||
if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
|
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>
|
2014-11-21 Steve Ellcey <sellcey@imgtec.com>
|
||||||
|
|
||||||
* config/linux/mips/futex.h (SYS_futex): Define if not already done.
|
* config/linux/mips/futex.h (SYS_futex): Define if not already done.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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…
Reference in New Issue