1#include <stdlib.h> 2 3__attribute__((noinline, noclone)) void 4f1 (int ifval) 5{ 6 int x = 1, y = 2, z = 3; 7 #pragma omp parallel 8 #pragma omp single 9 { 10 #pragma omp task shared (x) depend(out: x) 11 x = 2; 12 #pragma omp task shared (x) depend(inout: x) 13 { 14 if (x != 2) 15 abort (); 16 x = 3; 17 } 18 #pragma omp task shared (x) depend(inout: x) 19 { 20 if (x != 3) 21 abort (); 22 x = 4; 23 } 24 #pragma omp task shared (z) depend(in: z) 25 if (z != 3) 26 abort (); 27 #pragma omp task shared (z) depend(in: z) 28 if (z != 3) 29 abort (); 30 #pragma omp task shared (z) depend(in: z) 31 if (z != 3) 32 abort (); 33 #pragma omp task shared (z) depend(in: z) 34 if (z != 3) 35 abort (); 36 #pragma omp task shared (z) depend(in: z) 37 if (z != 3) 38 abort (); 39 #pragma omp task shared (z) depend(in: z) 40 if (z != 3) 41 abort (); 42 #pragma omp task shared (y) depend(in: y) 43 if (y != 2) 44 abort (); 45 #pragma omp task shared (y) depend(in: y) 46 if (y != 2) 47 abort (); 48 #pragma omp task shared (y) depend(in: y) 49 if (y != 2) 50 abort (); 51 #pragma omp task shared (y) depend(in: y) 52 if (y != 2) 53 abort (); 54 #pragma omp task if (ifval) shared (x, y) depend(in: x) depend(inout: y) 55 { 56 if (x != 4 || y != 2) 57 abort (); 58 y = 3; 59 } 60 if (ifval == 0) 61 { 62 /* The above if (0) task should have waited till all 63 the tasks with x and y dependencies finish. */ 64 if (x != 4 || y != 3) 65 abort (); 66 x = 5; 67 y = 4; 68 } 69 #pragma omp task shared (z) depend(inout: z) 70 { 71 if (z != 3) 72 abort (); 73 z = 4; 74 } 75 #pragma omp task shared (z) depend(inout: z) 76 { 77 if (z != 4) 78 abort (); 79 z = 5; 80 } 81 #pragma omp taskwait 82 if (x != (ifval ? 4 : 5) || y != (ifval ? 3 : 4) || z != 5) 83 abort (); 84 #pragma omp task if (ifval) shared (x, y) depend(in: x) depend(inout: y) 85 { 86 if (x != (ifval ? 4 : 5) || y != (ifval ? 3 : 4)) 87 abort (); 88 } 89 } 90} 91 92int 93main () 94{ 95 f1 (0); 96 f1 (1); 97 return 0; 98} 99