From f8ac7d8f35e7c4a5444d4e554cb822f6346c1f2b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Dec 2019 00:58:04 +0100 Subject: [PATCH] re PR fortran/92899 ([OpenMP] ICE in gfc_trans_omp_atomic, at fortran/trans-openmp.c:3769) PR fortran/92899 * trans-openmp.c (gfc_trans_omp_atomic): For GFC_OMP_ATOMIC_SWAP, do look through conversion on expr2 if any. * testsuite/libgomp.fortran/atomic1.f90: New test. From-SVN: r279266 --- gcc/fortran/ChangeLog | 8 +++- gcc/fortran/trans-openmp.c | 1 - libgomp/ChangeLog | 5 ++ libgomp/testsuite/libgomp.fortran/atomic1.f90 | 46 +++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 libgomp/testsuite/libgomp.fortran/atomic1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 474c0a4b676..5fae7f295e1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,10 @@ -2019-12-11 Steven G. Kargl +2019-12-11 Jakub Jelinek + + PR fortran/92899 + * trans-openmp.c (gfc_trans_omp_atomic): For GFC_OMP_ATOMIC_SWAP, + do look through conversion on expr2 if any. + +2019-12-11 Steven G. Kargl PR fortran/92897 * array.c (gfc_set_array_spec): Remove invalid assert() triggered diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 356fd04e6c3..b6da7b983d5 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -3534,7 +3534,6 @@ gfc_trans_omp_atomic (gfc_code *code) expr2 = code->expr2; if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) != GFC_OMP_ATOMIC_WRITE) - && (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP) == 0 && expr2->expr_type == EXPR_FUNCTION && expr2->value.function.isym && expr2->value.function.isym->id == GFC_ISYM_CONVERSION) diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index e5fb05aea6d..dda2d9a09fc 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2019-12-11 Jakub Jelinek + + PR fortran/92899 + * testsuite/libgomp.fortran/atomic1.f90: New test. + 2019-12-11 Thomas Schwinge PR libgomp/92843 diff --git a/libgomp/testsuite/libgomp.fortran/atomic1.f90 b/libgomp/testsuite/libgomp.fortran/atomic1.f90 new file mode 100644 index 00000000000..e0c13536f94 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/atomic1.f90 @@ -0,0 +1,46 @@ +! PR fortran/92899 + +program pr92899 + real :: x = 1.0 + double precision :: y + integer(kind=4) :: z = 4 + integer(kind=8) :: w + !$omp atomic capture + y = x + x = 2.0 + !$omp end atomic + if (y /= 1.0 .or. x /= 2.0) stop 1 + !$omp atomic capture + x = y + y = 3.0 + !$omp end atomic + if (x /= 1.0 .or. y /= 3.0) stop 2 + !$omp atomic capture + w = z + z = 5 + !$omp end atomic + if (w /= 4 .or. z /= 5) stop 3 + !$omp atomic capture + z = w + w = 6 + !$omp end atomic + if (z /= 4 .or. w /= 6) stop 4 + !$omp atomic write + x = y + !$omp end atomic + if (x /= 3.0 .or. y /= 3.0) stop 5 + x = 7.0 + !$omp atomic write + y = x + !$omp end atomic + if (x /= 7.0 .or. y /= 7.0) stop 6 + !$omp atomic write + z = w + !$omp end atomic + if (z /= 6 .or. w /= 6) stop 7 + z = 8 + !$omp atomic write + w = z + !$omp end atomic + if (z /= 8 .or. w /= 8) stop 8 +end -- 2.30.2