omp-low.c (check_omp_nesting_restrictions): Allow cancel or cancellation point with taskgroup clause inside of taskloop.
* omp-low.c (check_omp_nesting_restrictions): Allow cancel or cancellation point with taskgroup clause inside of taskloop. Consider a taskloop construct without nogroup clause as implicit taskgroup for diagnostics if cancel/cancellation point with taskgroup clause is closely nested inside of taskgroup region. * c-c++-common/gomp/cancel-1.c (f2): Add various taskloop related tests. * testsuite/libgomp.c-c++-common/cancel-taskgroup-4.c: New test. From-SVN: r266722
This commit is contained in:
parent
e80944753d
commit
daa8c1d763
|
@ -1,5 +1,11 @@
|
||||||
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* omp-low.c (check_omp_nesting_restrictions): Allow cancel or
|
||||||
|
cancellation point with taskgroup clause inside of taskloop. Consider
|
||||||
|
a taskloop construct without nogroup clause as implicit taskgroup for
|
||||||
|
diagnostics if cancel/cancellation point with taskgroup clause is
|
||||||
|
closely nested inside of taskgroup region.
|
||||||
|
|
||||||
PR sanitizer/88291
|
PR sanitizer/88291
|
||||||
* asan.c (asan_clear_shadow): Move assert that len is multiple of 4
|
* asan.c (asan_clear_shadow): Move assert that len is multiple of 4
|
||||||
to the start of the function.
|
to the start of the function.
|
||||||
|
|
|
@ -2744,7 +2744,10 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
|
||||||
kind = "sections";
|
kind = "sections";
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
if (gimple_code (ctx->stmt) != GIMPLE_OMP_TASK)
|
if (!is_task_ctx (ctx)
|
||||||
|
&& (!is_taskloop_ctx (ctx)
|
||||||
|
|| ctx->outer == NULL
|
||||||
|
|| !is_task_ctx (ctx->outer)))
|
||||||
bad = "#pragma omp task";
|
bad = "#pragma omp task";
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2767,6 +2770,17 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
|
||||||
"nested inside of %<taskgroup%> region",
|
"nested inside of %<taskgroup%> region",
|
||||||
construct);
|
construct);
|
||||||
return false;
|
return false;
|
||||||
|
case GIMPLE_OMP_TASK:
|
||||||
|
if (gimple_omp_task_taskloop_p (octx->stmt)
|
||||||
|
&& octx->outer
|
||||||
|
&& is_taskloop_ctx (octx->outer))
|
||||||
|
{
|
||||||
|
tree clauses
|
||||||
|
= gimple_omp_for_clauses (octx->outer->stmt);
|
||||||
|
if (!omp_find_clause (clauses, OMP_CLAUSE_NOGROUP))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* c-c++-common/gomp/cancel-1.c (f2): Add various taskloop related
|
||||||
|
tests.
|
||||||
|
|
||||||
PR sanitizer/88291
|
PR sanitizer/88291
|
||||||
* c-c++-common/asan/pr88291.c: New test.
|
* c-c++-common/asan/pr88291.c: New test.
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,40 @@ f2 (void)
|
||||||
#pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */
|
#pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */
|
||||||
#pragma omp cancellation point taskgroup
|
#pragma omp cancellation point taskgroup
|
||||||
}
|
}
|
||||||
|
#pragma omp taskloop
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp cancel parallel /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel for /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel sections /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
#pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point for /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma omp taskloop nogroup
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp cancel parallel /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel for /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel sections /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point for /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */
|
||||||
|
#pragma omp cancellation point taskgroup/* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancellation point taskgroup/* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
}
|
||||||
|
}
|
||||||
#pragma omp taskgroup
|
#pragma omp taskgroup
|
||||||
{
|
{
|
||||||
#pragma omp task
|
#pragma omp task
|
||||||
|
@ -105,6 +139,17 @@ f2 (void)
|
||||||
#pragma omp cancel taskgroup
|
#pragma omp cancel taskgroup
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#pragma omp taskloop nogroup
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
}
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#pragma omp taskgroup
|
#pragma omp taskgroup
|
||||||
{
|
{
|
||||||
|
@ -115,6 +160,18 @@ f2 (void)
|
||||||
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
}
|
}
|
||||||
|
#pragma omp taskloop
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
}
|
||||||
|
#pragma omp taskloop nogroup
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
{
|
{
|
||||||
|
@ -144,6 +201,45 @@ f2 (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#pragma omp taskloop
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
{
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
|
#pragma omp distribute
|
||||||
|
for (j = 0; j < 10; j++)
|
||||||
|
{
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
#pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma omp target data map(i)
|
||||||
|
{
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
|
#pragma omp cancel taskgroup
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#pragma omp for
|
#pragma omp for
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2018-12-02 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* testsuite/libgomp.c-c++-common/cancel-taskgroup-4.c: New test.
|
||||||
|
|
||||||
2018-11-30 Cesar Philippidis <cesar@codesourcery.com>
|
2018-11-30 Cesar Philippidis <cesar@codesourcery.com>
|
||||||
|
|
||||||
PR libgomp/88288
|
PR libgomp/88288
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/* { dg-do run } */
|
||||||
|
/* { dg-set-target-env-var OMP_CANCELLATION "true" } */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <omp.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
|
int c = 0;
|
||||||
|
#pragma omp barrier
|
||||||
|
#pragma omp master taskloop num_tasks (25) firstprivate (c)
|
||||||
|
for (i = 0; i < 50; i++)
|
||||||
|
{
|
||||||
|
if (c && omp_get_cancellation ())
|
||||||
|
abort ();
|
||||||
|
#pragma omp cancellation point taskgroup
|
||||||
|
usleep (30);
|
||||||
|
if (i > 10)
|
||||||
|
c = 1;
|
||||||
|
#pragma omp cancel taskgroup if (i > 10)
|
||||||
|
if (i > 10 && omp_get_cancellation ())
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
usleep (10);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue