OSDN Git Service

PR middle-end/39573
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 20:04:45 +0000 (20:04 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 20:04:45 +0000 (20:04 +0000)
* omp-low.c (expand_omp_taskreg): Finalize taskreg static local_decls
variables.

* libgomp.c++/pr39573.C: New test.

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

gcc/ChangeLog
gcc/omp-low.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr39573.C [new file with mode: 0644]

index 5c09748..45ed3e5 100644 (file)
@@ -5,6 +5,10 @@
        (gen_variable_die): Use DW_TAG_member tag for static data member
        declarations instead of DW_TAG_variable.
 
+       PR middle-end/39573
+       * omp-low.c (expand_omp_taskreg): Finalize taskreg static local_decls
+       variables.
+
 2009-04-08  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-sccvn.c (valueize_refs): Do not continue to
index 551af40..b0066ed 100644 (file)
@@ -3412,6 +3412,14 @@ expand_omp_taskreg (struct omp_region *region)
       /* Declare local variables needed in CHILD_CFUN.  */
       block = DECL_INITIAL (child_fn);
       BLOCK_VARS (block) = list2chain (child_cfun->local_decls);
+      /* The gimplifier could record temporaries in parallel/task block
+        rather than in containing function's local_decls chain,
+        which would mean cgraph missed finalizing them.  Do it now.  */
+      for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
+       if (TREE_CODE (t) == VAR_DECL
+           && TREE_STATIC (t)
+           && !DECL_EXTERNAL (t))
+         varpool_finalize_decl (t);
       DECL_SAVED_TREE (child_fn) = NULL;
       gimple_set_body (child_fn, bb_seq (single_succ (entry_bb)));
       TREE_USED (block) = 1;
index 15eb2c6..3a6a7ed 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/39573
+       * libgomp.c++/pr39573.C: New test.
+
 2009-04-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR other/39591
diff --git a/libgomp/testsuite/libgomp.c++/pr39573.C b/libgomp/testsuite/libgomp.c++/pr39573.C
new file mode 100644 (file)
index 0000000..0167222
--- /dev/null
@@ -0,0 +1,39 @@
+// PR middle-end/39573
+// { dg-do run }
+
+int z;
+
+void __attribute__((noinline))
+bar (int *x)
+{
+  #pragma omp atomic
+    z += x[2];
+  x[2] += x[3];
+}
+
+int
+main ()
+{
+  int i;
+#pragma omp parallel for
+  for (i = 0; i < 65536; i++)
+    {
+      int x[] =
+       {
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+         0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,
+       };
+      bar (x);
+    }
+}