]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
task.c (GOMP_taskgroup_end): If taskgroup->num_children is not zero...
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Aug 2014 15:45:50 +0000 (17:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 4 Aug 2014 15:45:50 +0000 (17:45 +0200)
* task.c (GOMP_taskgroup_end): If taskgroup->num_children
is not zero, but taskgroup->children is NULL and there are
any task->children, schedule those instead of waiting.
* testsuite/libgomp.c/depend-6.c: New test.
* testsuite/libgomp.c/depend-7.c: New test.
* testsuite/libgomp.c/depend-8.c: New test.
* testsuite/libgomp.c/depend-9.c: New test.
* testsuite/libgomp.c/depend-10.c: New test.

From-SVN: r213592

libgomp/ChangeLog
libgomp/task.c
libgomp/testsuite/libgomp.c/depend-10.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/depend-6.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/depend-7.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/depend-8.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/depend-9.c [new file with mode: 0644]

index 28a7867b73eca8aa6e5ea25ff8d09d269b8c6536..ee73689e702ecb403c1cfa96e10b079378d64b67 100644 (file)
@@ -1,3 +1,14 @@
+2014-08-04  Jakub Jelinek  <jakub@redhat.com>
+
+       * task.c (GOMP_taskgroup_end): If taskgroup->num_children
+       is not zero, but taskgroup->children is NULL and there are
+       any task->children, schedule those instead of waiting.
+       * testsuite/libgomp.c/depend-6.c: New test.
+       * testsuite/libgomp.c/depend-7.c: New test.
+       * testsuite/libgomp.c/depend-8.c: New test.
+       * testsuite/libgomp.c/depend-9.c: New test.
+       * testsuite/libgomp.c/depend-10.c: New test.
+
 2014-08-01  Jakub Jelinek  <jakub@redhat.com>
 
        * libgomp.h (struct gomp_task_depend_entry): Add redundant_out field.
index 58750eacf53eb855066ed5c9c45a92270da460a0..7d3233c6e1b3506dee10d5bfa4b2d23cd883eeaf 100644 (file)
@@ -1115,18 +1115,26 @@ GOMP_taskgroup_end (void)
       if (taskgroup->children == NULL)
        {
          if (taskgroup->num_children)
-           goto do_wait;
-         gomp_mutex_unlock (&team->task_lock);
-         if (to_free)
            {
-             gomp_finish_task (to_free);
-             free (to_free);
+             if (task->children == NULL)
+               goto do_wait;
+             child_task = task->children;
+            }
+          else
+           {
+             gomp_mutex_unlock (&team->task_lock);
+             if (to_free)
+               {
+                 gomp_finish_task (to_free);
+                 free (to_free);
+               }
+             goto finish;
            }
-         goto finish;
        }
-      if (taskgroup->children->kind == GOMP_TASK_WAITING)
+      else
+       child_task = taskgroup->children;
+      if (child_task->kind == GOMP_TASK_WAITING)
        {
-         child_task = taskgroup->children;
          cancelled
            = gomp_task_run_pre (child_task, child_task->parent, taskgroup,
                                 team);
@@ -1143,6 +1151,7 @@ GOMP_taskgroup_end (void)
        }
       else
        {
+         child_task = NULL;
         do_wait:
          /* All tasks we are waiting for are already running
             in other threads.  Wait for them.  */
@@ -1174,20 +1183,9 @@ GOMP_taskgroup_end (void)
         finish_cancelled:;
          size_t new_tasks
            = gomp_task_run_post_handle_depend (child_task, team);
-         child_task->prev_taskgroup->next_taskgroup
-           = child_task->next_taskgroup;
-         child_task->next_taskgroup->prev_taskgroup
-           = child_task->prev_taskgroup;
-         --taskgroup->num_children;
-         if (taskgroup->children == child_task)
-           {
-             if (child_task->next_taskgroup != child_task)
-               taskgroup->children = child_task->next_taskgroup;
-             else
-               taskgroup->children = NULL;
-           }
          gomp_task_run_post_remove_parent (child_task);
          gomp_clear_parent (child_task->children);
+         gomp_task_run_post_remove_taskgroup (child_task);
          to_free = child_task;
          child_task = NULL;
          team->task_count--;
diff --git a/libgomp/testsuite/libgomp.c/depend-10.c b/libgomp/testsuite/libgomp.c/depend-10.c
new file mode 100644 (file)
index 0000000..2137bf9
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
+
+#include "depend-5.c"
diff --git a/libgomp/testsuite/libgomp.c/depend-6.c b/libgomp/testsuite/libgomp.c/depend-6.c
new file mode 100644 (file)
index 0000000..d30e6e9
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
+
+#include "depend-1.c"
diff --git a/libgomp/testsuite/libgomp.c/depend-7.c b/libgomp/testsuite/libgomp.c/depend-7.c
new file mode 100644 (file)
index 0000000..bd4a3f9
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
+
+#include "depend-2.c"
diff --git a/libgomp/testsuite/libgomp.c/depend-8.c b/libgomp/testsuite/libgomp.c/depend-8.c
new file mode 100644 (file)
index 0000000..4dcce67
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
+
+#include "depend-3.c"
diff --git a/libgomp/testsuite/libgomp.c/depend-9.c b/libgomp/testsuite/libgomp.c/depend-9.c
new file mode 100644 (file)
index 0000000..a52c47a
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
+
+#include "depend-4.c"