1*8ab62da1SChi Chun Chen // expected-no-diagnostics 2*8ab62da1SChi Chun Chen // RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ %s -emit-llvm -o - | FileCheck %s 3*8ab62da1SChi Chun Chen // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s 4*8ab62da1SChi Chun Chen 5*8ab62da1SChi Chun Chen 6*8ab62da1SChi Chun Chen #define NNN 50 7*8ab62da1SChi Chun Chen int aaa[NNN]; 8*8ab62da1SChi Chun Chen parallel_loop()9*8ab62da1SChi Chun Chenvoid parallel_loop() { 10*8ab62da1SChi Chun Chen #pragma omp parallel 11*8ab62da1SChi Chun Chen { 12*8ab62da1SChi Chun Chen #pragma omp loop bind(parallel) 13*8ab62da1SChi Chun Chen for (int j = 0 ; j < NNN ; j++) { 14*8ab62da1SChi Chun Chen aaa[j] = j*NNN; 15*8ab62da1SChi Chun Chen } 16*8ab62da1SChi Chun Chen } 17*8ab62da1SChi Chun Chen } 18*8ab62da1SChi Chun Chen parallel_loop_orphan()19*8ab62da1SChi Chun Chenvoid parallel_loop_orphan() { 20*8ab62da1SChi Chun Chen #pragma omp loop bind(parallel) 21*8ab62da1SChi Chun Chen for (int j = 0 ; j < NNN ; j++) { 22*8ab62da1SChi Chun Chen aaa[j] = j*NNN; 23*8ab62da1SChi Chun Chen } 24*8ab62da1SChi Chun Chen } 25*8ab62da1SChi Chun Chen 26*8ab62da1SChi Chun Chen teams_loop()27*8ab62da1SChi Chun Chenvoid teams_loop() { 28*8ab62da1SChi Chun Chen #pragma omp teams 29*8ab62da1SChi Chun Chen { 30*8ab62da1SChi Chun Chen #pragma omp loop bind(teams) 31*8ab62da1SChi Chun Chen for (int j = 0 ; j < NNN ; j++) { 32*8ab62da1SChi Chun Chen aaa[j] = j*NNN; 33*8ab62da1SChi Chun Chen } 34*8ab62da1SChi Chun Chen } 35*8ab62da1SChi Chun Chen } 36*8ab62da1SChi Chun Chen thread_loop()37*8ab62da1SChi Chun Chenvoid thread_loop() { 38*8ab62da1SChi Chun Chen #pragma omp parallel 39*8ab62da1SChi Chun Chen { 40*8ab62da1SChi Chun Chen #pragma omp loop bind(thread) 41*8ab62da1SChi Chun Chen for (int j = 0 ; j < NNN ; j++) { 42*8ab62da1SChi Chun Chen aaa[j] = j*NNN; 43*8ab62da1SChi Chun Chen } 44*8ab62da1SChi Chun Chen } 45*8ab62da1SChi Chun Chen } 46*8ab62da1SChi Chun Chen thread_loop_orphan()47*8ab62da1SChi Chun Chenvoid thread_loop_orphan() { 48*8ab62da1SChi Chun Chen #pragma omp loop bind(thread) 49*8ab62da1SChi Chun Chen for (int j = 0 ; j < NNN ; j++) { 50*8ab62da1SChi Chun Chen aaa[j] = j*NNN; 51*8ab62da1SChi Chun Chen } 52*8ab62da1SChi Chun Chen } 53*8ab62da1SChi Chun Chen main()54*8ab62da1SChi Chun Chenint main() { 55*8ab62da1SChi Chun Chen parallel_loop(); 56*8ab62da1SChi Chun Chen parallel_loop_orphan(); 57*8ab62da1SChi Chun Chen teams_loop(); 58*8ab62da1SChi Chun Chen thread_loop(); 59*8ab62da1SChi Chun Chen thread_loop_orphan(); 60*8ab62da1SChi Chun Chen 61*8ab62da1SChi Chun Chen return 0; 62*8ab62da1SChi Chun Chen } 63*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop{{.+}} 64*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_loop{{.+}}.omp_outlined{{.*}}) 65*8ab62da1SChi Chun Chen // 66*8ab62da1SChi Chun Chen // 67*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop{{.+}}.omp_outlined{{.+}} 68*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_for_static_init_4 69*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.body: 70*8ab62da1SChi Chun Chen // CHECK: omp.loop.exit: 71*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}__kmpc_for_static_fini 72*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}__kmpc_barrier 73*8ab62da1SChi Chun Chen // 74*8ab62da1SChi Chun Chen // 75*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop_orphan{{.+}} 76*8ab62da1SChi Chun Chen // CHECK: [[TMP0:%.*]] = call {{.+}}__kmpc_global_thread_num 77*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_for_static_init_4 78*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.body: 79*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.end: 80*8ab62da1SChi Chun Chen // CHECK: omp.loop.exit: 81*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}__kmpc_for_static_fini 82*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}__kmpc_barrier 83*8ab62da1SChi Chun Chen // 84*8ab62da1SChi Chun Chen // 85*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}teams_loop{{.+}} 86*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_fork_teams({{.+}}teams_loop{{.+}}.omp_outlined{{.*}}) 87*8ab62da1SChi Chun Chen // 88*8ab62da1SChi Chun Chen // 89*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}teams_loop{{.+}}.omp_outlined{{.+}} 90*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_for_static_init_4 91*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.body: 92*8ab62da1SChi Chun Chen // CHECK: omp.loop.exit: 93*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}__kmpc_for_static_fini 94*8ab62da1SChi Chun Chen // 95*8ab62da1SChi Chun Chen // 96*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop{{.+}} 97*8ab62da1SChi Chun Chen // CHECK: call {{.+}}__kmpc_fork_call({{.+}}thread_loop{{.+}}.omp_outlined{{.*}}) 98*8ab62da1SChi Chun Chen // 99*8ab62da1SChi Chun Chen // 100*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop{{.+}}.omp_outlined{{.+}} 101*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.body: 102*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.end: 103*8ab62da1SChi Chun Chen // 104*8ab62da1SChi Chun Chen // 105*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop_orphan{{.+}} 106*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.cond: 107*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.body: 108*8ab62da1SChi Chun Chen // CHECK: omp.inner.for.end: 109*8ab62da1SChi Chun Chen // 110*8ab62da1SChi Chun Chen // 111*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}main{{.+}} 112*8ab62da1SChi Chun Chen // CHECK: call {{.+}}parallel_loop{{.+}}() 113*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}parallel_loop_orphan{{.+}}() 114*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}teams_loop{{.+}}() 115*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}thread_loop{{.+}}() 116*8ab62da1SChi Chun Chen // CHECK-NEXT: call {{.+}}thread_loop_orphan{{.+}}() 117*8ab62da1SChi Chun Chen // 118