https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80394
Bug ID: 80394 Summary: Empty OpenMP task is wrongly removed when optimizing Product: gcc Version: 7.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libgomp Assignee: unassigned at gcc dot gnu.org Reporter: sergi.mateo at bsc dot es CC: jakub at gcc dot gnu.org Target Milestone: --- Hi, In the following code: #include<unistd.h> #include<stdio.h> void foo(int foo_id) { int x = 0; for (int i = 0; i < 5; ++i) { #pragma omp task depend(inout: x) shared(x) { printf("%d -> hola : %d\n", foo_id, i); usleep(1000000); x++; } } #pragma omp task if(0) depend(inout: x) { //printf("if\n"); } } int main() { #pragma omp parallel #pragma omp single { foo(0); foo(1); } } GCC wrongly removes the empty second task when optimizing (-O2 or higher). Then, tasks created by the first call to 'foo' may be executed concurrently with the tasks created by the second call, which is wrong: when a thread reaches the empty task, the current task region should be suspended until all the predecessor tasks of that task are executed. Uncommenting the 'printf(...);' statement or compiling with a lower optimization level make it work. Thanks!, Sergi