modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/compile/pr78694.c (about) 1 /* PR target/78694. */ 2 3 enum 4 { 5 MEMMODEL_RELAXED, 6 MEMMODEL_ACQUIRE, 7 PRIORITY_INSERT_END 8 }; 9 enum 10 { 11 PQ_CHILDREN, 12 PQ_TASKGROUP 13 }; 14 struct gomp_team_state 15 { 16 struct gomp_team *team; 17 }; 18 enum gomp_task_kind 19 { 20 GOMP_TASK_UNDEFERRED, 21 GOMP_TASK_WAITING 22 }; 23 struct gomp_taskwait 24 { 25 _Bool in_taskwait; 26 }; 27 struct gomp_task 28 { 29 struct gomp_task *parent; 30 int children_queue; 31 struct gomp_taskgroup *taskgroup; 32 int dependers; 33 struct gomp_taskwait taskwait; 34 enum gomp_task_kind kind; 35 _Bool in_tied_task; 36 } j, q, *n; 37 struct gomp_taskgroup 38 { 39 _Bool in_taskgroup_wait; 40 int num_children; 41 } l; 42 struct gomp_team 43 { 44 int task_queue; 45 int task_running_count; 46 }; 47 struct gomp_thread 48 { 49 struct gomp_team_state ts; 50 struct gomp_task task; 51 } extern __thread a; 52 53 int b, c, d, e, f, g, h, i, k, m, o, p, r; 54 55 void priority_queue_next_task (struct gomp_task *, int, int); 56 int gomp_task_run_pre (struct gomp_task *, struct gomp_task, struct gomp_team); 57 void priority_queue_insert (int, struct gomp_task); 58 void priority_queue_insert2 (int, struct gomp_task, int, int, int); 59 void priority_queue_insert3 (int, struct gomp_task, int, int, int); 60 void gomp_sem_post (int); 61 void free (void *); 62 63 _Bool s; 64 int 65 GOMP_taskgroup_end () 66 { 67 struct gomp_thread *t = &a; 68 struct gomp_team u = *t->ts.team; 69 struct gomp_task *v = &t->task, *w; 70 if (__atomic_load_n (&l.num_children, MEMMODEL_ACQUIRE)) 71 while (1) 72 { 73 if (l.num_children) 74 priority_queue_next_task (v, u.task_queue, r); 75 else if (w) 76 free (w); 77 if (n->kind == GOMP_TASK_WAITING) 78 { 79 s = gomp_task_run_pre (n, q, u); 80 if (__builtin_expect (s, 0)) 81 { 82 if (w) 83 free (w); 84 goto finish_cancelled; 85 } 86 n = 0; 87 l.in_taskgroup_wait = 1; 88 } 89 if (w) 90 { 91 t->task = *n; 92 if (__builtin_expect (p, 0)) 93 if (o) 94 t->task = *v; 95 } 96 if (n) 97 { 98 struct gomp_task x = x; 99 for (; i; b++) 100 { 101 struct gomp_task y = j; 102 if (g) 103 continue; 104 priority_queue_insert (PQ_CHILDREN, x); 105 if (x.taskwait.in_taskwait) 106 priority_queue_insert2 (PQ_TASKGROUP, y, e, 0, d); 107 if (h) 108 gomp_sem_post (f); 109 priority_queue_insert3 (k, y, PRIORITY_INSERT_END, 0, d); 110 ++c; 111 } 112 } 113 finish_cancelled: 114 w = (struct gomp_task *) (n - u.task_running_count - v); 115 } 116 v->taskgroup = (struct gomp_taskgroup *) m; 117 return 1; 118 }