xref: /llvm-project/openmp/tools/archer/tests/races/taskwait-depend.c (revision f7fc98a1cff737d860ea99fe37e3ddb55ff5c1ed)
11880d8f5SJoachim Jenke /*
21880d8f5SJoachim Jenke  * taskwait-depend.c -- Archer testcase
31880d8f5SJoachim Jenke  * derived from DRB165-taskdep4-orig-omp50-yes.c in DataRaceBench
41880d8f5SJoachim Jenke  */
51880d8f5SJoachim Jenke //===----------------------------------------------------------------------===//
61880d8f5SJoachim Jenke //
71880d8f5SJoachim Jenke // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
81880d8f5SJoachim Jenke //
91880d8f5SJoachim Jenke // See tools/archer/LICENSE.txt for details.
101880d8f5SJoachim Jenke // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
111880d8f5SJoachim Jenke //
121880d8f5SJoachim Jenke //===----------------------------------------------------------------------===//
131880d8f5SJoachim Jenke 
141880d8f5SJoachim Jenke // RUN: %libarcher-compile-and-run-race | FileCheck %s
151880d8f5SJoachim Jenke // RUN: %libarcher-compile-and-run-race-noserial | FileCheck %s
161880d8f5SJoachim Jenke // REQUIRES: tsan
171880d8f5SJoachim Jenke 
181880d8f5SJoachim Jenke #include "ompt/ompt-signal.h"
191880d8f5SJoachim Jenke #include <omp.h>
201880d8f5SJoachim Jenke #include <stdio.h>
211880d8f5SJoachim Jenke 
foo()221880d8f5SJoachim Jenke void foo() {
231880d8f5SJoachim Jenke 
241880d8f5SJoachim Jenke   int x = 0, y = 2, sem = 0;
251880d8f5SJoachim Jenke 
261880d8f5SJoachim Jenke #pragma omp task depend(inout : x) shared(x, sem)
271880d8f5SJoachim Jenke   {
281880d8f5SJoachim Jenke     OMPT_SIGNAL(sem);
291880d8f5SJoachim Jenke     x++; // 1st Child Task
301880d8f5SJoachim Jenke   }
311880d8f5SJoachim Jenke 
321880d8f5SJoachim Jenke #pragma omp task shared(y, sem)
331880d8f5SJoachim Jenke   {
341880d8f5SJoachim Jenke     OMPT_SIGNAL(sem);
351880d8f5SJoachim Jenke     y--; // 2nd child task
361880d8f5SJoachim Jenke   }
371880d8f5SJoachim Jenke 
381880d8f5SJoachim Jenke   OMPT_WAIT(sem, 2);
391880d8f5SJoachim Jenke #pragma omp taskwait depend(in : x) // 1st taskwait
401880d8f5SJoachim Jenke 
411880d8f5SJoachim Jenke   printf("x=%d\n", x);
421880d8f5SJoachim Jenke   printf("y=%d\n", y);
431880d8f5SJoachim Jenke #pragma omp taskwait // 2nd taskwait
441880d8f5SJoachim Jenke }
451880d8f5SJoachim Jenke 
main()461880d8f5SJoachim Jenke int main() {
471880d8f5SJoachim Jenke #pragma omp parallel num_threads(2)
481880d8f5SJoachim Jenke #pragma omp single
491880d8f5SJoachim Jenke   foo();
501880d8f5SJoachim Jenke 
511880d8f5SJoachim Jenke   return 0;
521880d8f5SJoachim Jenke }
531880d8f5SJoachim Jenke 
541880d8f5SJoachim Jenke // CHECK: WARNING: ThreadSanitizer: data race
551880d8f5SJoachim Jenke // CHECK-NEXT:   {{(Write|Read)}} of size 4
56*f7fc98a1SIlya Leoshkevich // CHECK-NEXT: #0 {{.*}}taskwait-depend.c:42
571880d8f5SJoachim Jenke // CHECK:   Previous write of size 4
58*f7fc98a1SIlya Leoshkevich // CHECK-NEXT: #0 {{.*}}taskwait-depend.c:35
591880d8f5SJoachim Jenke // CHECK: ThreadSanitizer: reported {{[0-9]+}} warnings
60