1*1880d8f5SJoachim Jenke /* 2*1880d8f5SJoachim Jenke * taskwait-depend.c -- Archer testcase 3*1880d8f5SJoachim Jenke * derived from DRB166-taskdep4-orig-omp50-no.c in DataRaceBench 4*1880d8f5SJoachim Jenke */ 5*1880d8f5SJoachim Jenke //===----------------------------------------------------------------------===// 6*1880d8f5SJoachim Jenke // 7*1880d8f5SJoachim Jenke // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 8*1880d8f5SJoachim Jenke // 9*1880d8f5SJoachim Jenke // See tools/archer/LICENSE.txt for details. 10*1880d8f5SJoachim Jenke // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 11*1880d8f5SJoachim Jenke // 12*1880d8f5SJoachim Jenke //===----------------------------------------------------------------------===// 13*1880d8f5SJoachim Jenke 14*1880d8f5SJoachim Jenke // RUN: %libarcher-compile-and-run | FileCheck %s 15*1880d8f5SJoachim Jenke // REQUIRES: tsan 16*1880d8f5SJoachim Jenke 17*1880d8f5SJoachim Jenke #include "ompt/ompt-signal.h" 18*1880d8f5SJoachim Jenke #include <omp.h> 19*1880d8f5SJoachim Jenke #include <stdio.h> 20*1880d8f5SJoachim Jenke foo()21*1880d8f5SJoachim Jenkevoid foo() { 22*1880d8f5SJoachim Jenke 23*1880d8f5SJoachim Jenke int x = 0, y = 2, sem = 0; 24*1880d8f5SJoachim Jenke 25*1880d8f5SJoachim Jenke #pragma omp task depend(inout : x) shared(x, sem) 26*1880d8f5SJoachim Jenke { 27*1880d8f5SJoachim Jenke OMPT_SIGNAL(sem); 28*1880d8f5SJoachim Jenke x++; // 1st Child Task 29*1880d8f5SJoachim Jenke } 30*1880d8f5SJoachim Jenke 31*1880d8f5SJoachim Jenke #pragma omp task shared(y, sem) 32*1880d8f5SJoachim Jenke { 33*1880d8f5SJoachim Jenke OMPT_SIGNAL(sem); 34*1880d8f5SJoachim Jenke y--; // 2nd child task 35*1880d8f5SJoachim Jenke } 36*1880d8f5SJoachim Jenke 37*1880d8f5SJoachim Jenke OMPT_WAIT(sem, 2); 38*1880d8f5SJoachim Jenke #pragma omp taskwait depend(in : x) // 1st taskwait 39*1880d8f5SJoachim Jenke 40*1880d8f5SJoachim Jenke printf("x=%d\n", x); 41*1880d8f5SJoachim Jenke 42*1880d8f5SJoachim Jenke #pragma omp taskwait // 2nd taskwait 43*1880d8f5SJoachim Jenke 44*1880d8f5SJoachim Jenke printf("y=%d\n", y); 45*1880d8f5SJoachim Jenke } 46*1880d8f5SJoachim Jenke main()47*1880d8f5SJoachim Jenkeint main() { 48*1880d8f5SJoachim Jenke #pragma omp parallel num_threads(2) 49*1880d8f5SJoachim Jenke #pragma omp single 50*1880d8f5SJoachim Jenke foo(); 51*1880d8f5SJoachim Jenke 52*1880d8f5SJoachim Jenke return 0; 53*1880d8f5SJoachim Jenke } 54*1880d8f5SJoachim Jenke 55*1880d8f5SJoachim Jenke // CHECK-NOT: ThreadSanitizer: data race 56*1880d8f5SJoachim Jenke // CHECK-NOT: ThreadSanitizer: reported 57*1880d8f5SJoachim Jenke // CHECK: y=1 58