OSDN Git Service

PR middle-end/35611
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2008 12:21:02 +0000 (12:21 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2008 12:21:02 +0000 (12:21 +0000)
* gimplify.c (gimplify_expr): Gimplify second operand of
OMP_ATOMIC_LOAD.

* testsuite/libgomp.c/atomic-4.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133309 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/atomic-4.c [new file with mode: 0644]

index 2830927..e5706fb 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/35611
+       * gimplify.c (gimplify_expr): Gimplify second operand of
+       OMP_ATOMIC_LOAD.
+
 2008-03-17  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/19637
index a75c711..102ce3e 100644 (file)
@@ -6022,12 +6022,18 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
 
        case OMP_RETURN:
        case OMP_CONTINUE:
-        case OMP_ATOMIC_LOAD:
-        case OMP_ATOMIC_STORE:
-
+       case OMP_ATOMIC_STORE:
          ret = GS_ALL_DONE;
          break;
 
+       case OMP_ATOMIC_LOAD:
+         if (gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, NULL,
+             is_gimple_val, fb_rvalue) != GS_ALL_DONE)
+           ret = GS_ERROR;
+         else
+           ret = GS_ALL_DONE;
+         break;
+
        case POINTER_PLUS_EXPR:
           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
             The second is gimple immediate saving a need for extra statement.
index 5c54884..c456e7d 100644 (file)
@@ -1,5 +1,8 @@
 2008-03-18  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/35611
+       * testsuite/libgomp.c/atomic-4.c: New test.
+
        PR libgomp/35625
        * iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end.
        (gomp_iter_guided_next): Likewise.
diff --git a/libgomp/testsuite/libgomp.c/atomic-4.c b/libgomp/testsuite/libgomp.c/atomic-4.c
new file mode 100644 (file)
index 0000000..10f8197
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR middle-end/35611 */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+int
+main (void)
+{
+  long double d = .0L;
+  int i;
+  #pragma omp parallel for shared (d)
+    for (i = 0; i < 1000; i++)
+      #pragma omp atomic
+       d += 1.0L;
+  if (d != 1000.0L)
+    abort ();
+  return 0;
+}