]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: Make finalize_task_copyfn order reproduceable [PR104517]
authorJakub Jelinek <jakub@redhat.com>
Tue, 15 Feb 2022 09:22:30 +0000 (10:22 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 10 May 2022 08:14:33 +0000 (10:14 +0200)
The following testcase fails -fcompare-debug, because finalize_task_copyfn
was invoked from splay tree destruction, whose order can in some cases
depend on -g/-g0.  The fix is to queue the task stmts that need copyfn
in a vector and run finalize_task_copyfn on elements of that vector.

2022-02-15  Jakub Jelinek  <jakub@redhat.com>

PR debug/104517
* omp-low.c (task_cpyfns): New variable.
(delete_omp_context): Don't call finalize_task_copyfn from here.
(create_task_copyfn): Push task_stmt into task_cpyfns.
(execute_lower_omp): Call finalize_task_copyfn here on entries from
task_cpyfns vector and release the vector.

(cherry picked from commit 6a0d6e7ca9b9e338e82572db79c26168684a7441)

gcc/omp-low.c

index 50a2b3b1ebd8d5835afd324ffe513cfeefc69852..f9aa39308036baaca10e6131ba171fb7f99b297e 100644 (file)
@@ -177,6 +177,7 @@ static int target_nesting_level;
 static bitmap task_shared_vars;
 static bitmap global_nonaddressable_vars;
 static vec<omp_context *> taskreg_contexts;
+static vec<gomp_task *> task_cpyfns;
 
 static void scan_omp (gimple_seq *, omp_context *);
 static tree scan_omp_1_op (tree *, int *, void *);
@@ -1028,9 +1029,6 @@ delete_omp_context (splay_tree_value value)
        DECL_ABSTRACT_ORIGIN (t) = NULL;
     }
 
-  if (is_task_ctx (ctx))
-    finalize_task_copyfn (as_a <gomp_task *> (ctx->stmt));
-
   if (ctx->task_reduction_map)
     {
       ctx->task_reductions.release ();
@@ -10901,6 +10899,7 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
   size_t looptempno = 0;
 
   child_fn = gimple_omp_task_copy_fn (task_stmt);
+  task_cpyfns.safe_push (task_stmt);
   child_cfun = DECL_STRUCT_FUNCTION (child_fn);
   gcc_assert (child_cfun->cfg == NULL);
   DECL_SAVED_TREE (child_fn) = alloc_stmt_list ();
@@ -13201,6 +13200,12 @@ execute_lower_omp (void)
       && (TREE_CODE (TREE_TYPE (DECL_ARGUMENTS (current_function_decl)))
          == POINTER_TYPE))
     remove_member_access_dummy_vars (DECL_INITIAL (current_function_decl));
+
+  gomp_task *task_stmt;
+  unsigned j;
+  FOR_EACH_VEC_ELT (task_cpyfns, j, task_stmt)
+    finalize_task_copyfn (task_stmt);
+  task_cpyfns.release ();
   return 0;
 }