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 Jenkevoid 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 Jenkeint 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