diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp index 15ffc1454fe9..6dae9dc73e7a 100644 --- a/openmp/runtime/src/kmp_tasking.cpp +++ b/openmp/runtime/src/kmp_tasking.cpp @@ -3923,9 +3923,12 @@ kmp_task_t *__kmp_task_dup_alloc(kmp_info_t *thread, kmp_task_t *task_src) { } taskdata->td_alloc_thread = thread; taskdata->td_parent = parent_task; - taskdata->td_taskgroup = - parent_task - ->td_taskgroup; // task inherits the taskgroup from the parent task + // task inherits the taskgroup from the parent task + taskdata->td_taskgroup = parent_task->td_taskgroup; + // tied task needs to initialize the td_last_tied at creation, + // untied one does this when it is scheduled for execution + if (taskdata->td_flags.tiedness == TASK_TIED) + taskdata->td_last_tied = taskdata; // Only need to keep track of child task counts if team parallel and tasking // not serialized diff --git a/openmp/runtime/test/tasking/omp_task_red_taskloop.c b/openmp/runtime/test/tasking/omp_task_red_taskloop.c new file mode 100644 index 000000000000..89c66256da73 --- /dev/null +++ b/openmp/runtime/test/tasking/omp_task_red_taskloop.c @@ -0,0 +1,57 @@ +// RUN: %libomp-compile-and-run + +#include +#include + +int r; + +int work(int k, int l) +{ + return k + l + 1; +} +void bar(int i) { + #pragma omp taskgroup task_reduction(+:r) + { int th_gen = omp_get_thread_num(); + #pragma omp task in_reduction(+:r) firstprivate(i, th_gen) + { + r += work(i, 0); +printf("executing task (%d, 0), th %d (gen by th %d)\n", i, omp_get_thread_num(), th_gen); + } + #pragma omp task in_reduction(+:r) firstprivate(i, th_gen) + { + r += work(i, 1); +printf("executing task (%d, 1), th %d (gen by th %d)\n", i, omp_get_thread_num(), th_gen); + } + } +} +int foo() { + int i; + int th_gen = omp_get_thread_num(); + #pragma omp taskgroup task_reduction(+:r) + { + bar(0); + } +printf("th %d passed bar0\n", th_gen); + #pragma omp taskloop reduction(+:r) firstprivate(th_gen) + for (i = 1; i < 4; ++i) { + bar(i); +printf("th %d (gen by th %d) passed bar%d in taskloop\n", omp_get_thread_num(), th_gen, i); +// #pragma omp task in_reduction(+:r) + r += i; + } + return 0; +} +// res = 2*((1+2)+(2+3)+(3+4)+(4+5)+1+2+3) = 60 +#define res 60 +int main() +{ + r = 0; + #pragma omp parallel num_threads(2) + foo(); + if (r == res) { + return 0; + } else { + printf("error r = %d (!= %d)\n", r, res); + return 1; + } +}