/* * taskwait-depend.c -- Archer testcase * derived from DRB166-taskdep4-orig-omp50-no.c in DataRaceBench */ //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // // See tools/archer/LICENSE.txt for details. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // RUN: %libarcher-compile-and-run | FileCheck %s // REQUIRES: tsan #include "ompt/ompt-signal.h" #include #include void foo() { int x = 0, y = 2, sem = 0; #pragma omp task depend(inout : x) shared(x, sem) { OMPT_SIGNAL(sem); x++; // 1st Child Task } #pragma omp task shared(y, sem) { OMPT_SIGNAL(sem); y--; // 2nd child task } OMPT_WAIT(sem, 2); #pragma omp taskwait depend(in : x) // 1st taskwait printf("x=%d\n", x); #pragma omp taskwait // 2nd taskwait printf("y=%d\n", y); } int main() { #pragma omp parallel num_threads(2) #pragma omp single foo(); return 0; } // CHECK-NOT: ThreadSanitizer: data race // CHECK-NOT: ThreadSanitizer: reported // CHECK: y=1