]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/86542 (wrong-code for collapsed taskloop which needs omp_c...
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Oct 2018 17:30:45 +0000 (19:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 12 Oct 2018 17:30:45 +0000 (19:30 +0200)
Backported from mainline
2018-07-17  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/86542
* omp-low.c (create_task_copyfn): Copy over also fields corresponding
to _looptemp_ clauses, other than the first two.

* testsuite/libgomp.c++/pr86542.C: New test.

From-SVN: r265118

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

index 5c5459ed8a0aaa6f70b7e983c651fc4bd82e2257..0af69b9be55dcc19c56d976d40887fbc1be09292 100644 (file)
@@ -3,6 +3,10 @@
        Backported from mainline
        2018-07-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/86542
+       * omp-low.c (create_task_copyfn): Copy over also fields corresponding
+       to _looptemp_ clauses, other than the first two.
+
        PR middle-end/86539
        * gimplify.c (gimplify_omp_for): Ensure taskloop firstprivatized init
        and cond temporaries don't have reference type if iterator has
index 04cbf7416670b32e82d8e940e5df8d547a9c1944..304cde8219483d094526cb4582869e90e1081354 100644 (file)
@@ -15393,6 +15393,7 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
   splay_tree_node n;
   struct omp_taskcopy_context tcctx;
   location_t loc = gimple_location (task_stmt);
+  size_t looptempno = 0;
 
   child_fn = gimple_omp_task_copy_fn (task_stmt);
   child_cfun = DECL_STRUCT_FUNCTION (child_fn);
@@ -15506,6 +15507,15 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
        t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
        append_to_statement_list (t, &list);
        break;
+      case OMP_CLAUSE__LOOPTEMP_:
+       /* Fields for first two _looptemp_ clauses are initialized by
+          GOMP_taskloop*, the rest are handled like firstprivate.  */
+        if (looptempno < 2)
+         {
+           looptempno++;
+           break;
+         }
+       /* FALLTHRU */
       case OMP_CLAUSE_FIRSTPRIVATE:
        decl = OMP_CLAUSE_DECL (c);
        if (is_variable_sized (decl))
@@ -15531,7 +15541,10 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
          src = decl;
        dst = build_simple_mem_ref_loc (loc, arg);
        dst = omp_build_component_ref (dst, f);
-       t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src);
+       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE__LOOPTEMP_)
+         t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
+       else
+         t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src);
        append_to_statement_list (t, &list);
        break;
       case OMP_CLAUSE_PRIVATE:
index 45357816aec0faff40b0b7d24c98d8504413c423..011ea233ff4237f94542cadeb66d823d98094590 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2018-07-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/86542
+       * testsuite/libgomp.c++/pr86542.C: New test.
+
        PR middle-end/86539
        * testsuite/libgomp.c++/pr86539.C: New test.
 
diff --git a/libgomp/testsuite/libgomp.c++/pr86542.C b/libgomp/testsuite/libgomp.c++/pr86542.C
new file mode 100644 (file)
index 0000000..a8ebe57
--- /dev/null
@@ -0,0 +1,37 @@
+// PR middle-end/86542
+
+struct S { int s; S (); ~S (); S (const S &); };
+S s;
+
+S::S ()
+{
+}
+
+S::~S ()
+{
+}
+
+S::S (const S &x)
+{
+  s = x.s;
+}
+
+__attribute__((noinline, noclone)) void
+foo (int i, int j, int k, S s)
+{
+  if (i != 0 || j != 0 || k != 0 || s.s != 12)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  volatile int inc = 16, jnc = 16, knc = 16;
+  s.s = 12;
+  #pragma omp taskloop collapse (3) firstprivate (s)
+  for (int i = 0; i < 16; i += inc)
+    for (int j = 0; j < 16; j += jnc)
+      for (int k = 0; k < 16; k += knc)
+       foo (i, j, k, s);
+  return 0;
+}