]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/63938 (OpenMP atomic update does not protect access to automa...
authorJakub Jelinek <jakub@redhat.com>
Fri, 28 Nov 2014 17:04:51 +0000 (18:04 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 28 Nov 2014 17:04:51 +0000 (18:04 +0100)
Backported from mainline
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.

* libgomp.fortran/pr63938-1.f90: New test.
* libgomp.fortran/pr63938-2.f90: New test.

From-SVN: r218167

gcc/fortran/ChangeLog
gcc/fortran/trans-openmp.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/pr63938-1.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/pr63938-2.f90 [new file with mode: 0644]

index b5dfcf1fa4708b27d0dad5003527f915cef27e1b..2ce28c34c3f3f26abafbd433f9112ca09957fc0d 100644 (file)
@@ -1,3 +1,12 @@
+2014-11-28  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       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-10-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/59488
index 53a78f08875f6bb334668611e73d5c8904a332d9..7076e3bef155490242791e6db9317fdb4cd07e20 100644 (file)
@@ -1227,6 +1227,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_WRITE)
index 8b549f7e41e2d6f2d8485e7d0530976fb5109d06..729e54deb8e938cdfc592f0cc4e0957c4a139bf9 100644 (file)
@@ -1,6 +1,12 @@
 2014-11-28  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-10-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR libgomp/61200
diff --git a/libgomp/testsuite/libgomp.fortran/pr63938-1.f90 b/libgomp/testsuite/libgomp.fortran/pr63938-1.f90
new file mode 100644 (file)
index 0000000..27501b2
--- /dev/null
@@ -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
diff --git a/libgomp/testsuite/libgomp.fortran/pr63938-2.f90 b/libgomp/testsuite/libgomp.fortran/pr63938-2.f90
new file mode 100644 (file)
index 0000000..e5f37ba
--- /dev/null
@@ -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