180 lines · cpp
1// expected-no-diagnostics2// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ %s -emit-llvm -o - | FileCheck %s3// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s4 5#define NNN 506int aaa[NNN];7 8void parallel_taskgroup_loop() {9 #pragma omp parallel10 {11 #pragma omp taskgroup12 for (int i = 0 ; i < 2 ; i++) {13 #pragma omp loop14 for (int j = 0 ; j < NNN ; j++) {15 aaa[j] = j*NNN;16 }17 }18 }19}20 21void parallel_taskwait_loop() {22 #pragma omp parallel23 {24 #pragma omp taskwait25 for (int i = 0 ; i < 2 ; i++) {26 #pragma omp loop27 for (int j = 0 ; j < NNN ; j++) {28 aaa[j] = j*NNN;29 }30 }31 }32}33 34void parallel_single_loop() {35 #pragma omp parallel36 {37 for (int i = 0 ; i < 2 ; i++) {38 #pragma omp single39 #pragma omp loop40 for (int j = 0 ; j < NNN ; j++) {41 aaa[j] = j*NNN;42 }43 }44 }45}46 47void parallel_order_loop() {48 #pragma omp parallel49 {50 #pragma omp for order(concurrent)51 {52 for (int i = 0 ; i < 2 ; i++) {53 #pragma omp loop54 for (int j = 0 ; j < NNN ; j++) {55 aaa[j] = j*NNN;56 }57 }58 }59 }60}61 62 63void parallel_cancel_loop(bool flag) {64 #pragma omp ordered65 for (int i = 0 ; i < 2 ; i++) {66 #pragma omp parallel67 {68 #pragma omp cancel parallel if(flag)69 aaa[0] = 0;70 #pragma omp loop bind(parallel)71 for (int j = 0 ; j < NNN ; j++) {72 aaa[j] = j*NNN;73 }74 }75 }76}77 78int79main(int argc, char *argv[]) {80 parallel_taskgroup_loop();81 parallel_taskwait_loop();82 parallel_single_loop();83 parallel_order_loop();84 parallel_cancel_loop(true);85 parallel_cancel_loop(false);86 87 return 0;88}89// CHECK-LABEL: define {{.+}}parallel_taskgroup_loop{{.+}} {90// CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_taskgroup_loop{{.+}}.omp_outlined{{.*}}91//92//93// CHECK-LABEL: define {{.+}}parallel_taskgroup_loop{{.+}}.omp_outlined{{.+}} {94// CHECK: call {{.+}}__kmpc_taskgroup95// CHECK: for.body:96// CHECK: omp.inner.for.cond:97// CHECK: omp.inner.for.body:98// CHECK: omp.inner.for.inc:99// CHECK: omp.inner.for.end:100// CHECK: for.end:101// CHECK: call {{.+}}__kmpc_end_taskgroup102//103//104// CHECK-LABEL: define {{.+}}parallel_taskwait_loop{{.+}} {105// CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_taskwait_loop{{.+}}.omp_outlined{{.*}})106//107//108// CHECK-LABEL: define {{.+}}parallel_taskwait_loop{{.+}}.omp_outlined{{.+}} {109// CHECK: [[TMP2:%.*]] = {{.+}}__kmpc_omp_taskwait110// CHECK: for.cond:111// CHECK: for.body:112// CHECK: {{.+}}__kmpc_for_static_init_4113// CHECK: omp.inner.for.cond:114// CHECK: omp.inner.for.body:115// CHECK: omp.body.continue:116// CHECK: omp.inner.for.inc:117// CHECK: omp.inner.for.end:118// CHECK: omp.loop.exit:119// CHECK: call void @__kmpc_for_static_fini120// CHECK: call void @__kmpc_barrier121// CHECK: for.end:122//123//124// CHECK-LABEL: define {{.+}}parallel_single_loop{{.+}} {125// CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_single_loop{{.+}}.omp_outlined{{.*}})126//127//128// CHECK-LABEL: define {{.+}}parallel_single_loop{{.+}}.omp_outlined{{.+}} {129// CHECK: for.body:130// CHECK: [[TMP3:%.*]] = call {{.+}}__kmpc_single131// CHECK: omp.inner.for.end:132// CHECK: call {{.+}}__kmpc_end_single133// CHECK: omp_if.end:134// CHECK: call {{.+}}__kmpc_barrier135// CHECK: for.end:136//137//138// CHECK-LABEL: define {{.+}}parallel_order_loop{{.+}} {139// CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_order_loop{{.+}}.omp_outlined{{.*}})140//141//142// CHECK-LABEL: define {{.+}}parallel_order_loop{{.+}}.omp_outlined{{.+}} {143// CHECK: call {{.+}}__kmpc_for_static_init_4144// CHECK: omp.inner.for.body:145// CHECK: omp.loop.exit:146// CHECK: call {{.+}}__kmpc_for_static_fini147// CHECK: call {{.+}}__kmpc_barrier148//149//150// CHECK-LABEL: define {{.+}}parallel_cancel_loop{{.+}} {151// CHECK: call {{.+}}__kmpc_ordered152// CHECK: for.body:153// CHECK: call {{.+}}__kmpc_fork_call({{.+}}parallel_cancel_loop{{.+}}.omp_outlined{{.+}})154// CHECK: for.end:155// CHECK: call {{.+}}__kmpc_end_ordered156//157//158// CHECK-LABEL: define {{.+}}parallel_cancel_loop{{.+}}.omp_outlined{{.+}} {159// CHECK: omp_if.then:160// CHECK: [[TMP4:%.*]] = call {{.+}}__kmpc_cancel161// CHECK: .cancel.exit:162// CHECK: [[TMP8:%.*]] = call {{.+}}__kmpc_cancel_barrier163// CHECK: omp_if.end:164// CHECK: call {{.+}}__kmpc_for_static_init_4165// CHECK: omp.inner.for.body:166// CHECK: omp.loop.exit:167// CHECK: call {{.+}}__kmpc_for_static_fini168// CHECK: [[TMP24:%.*]] = call {{.+}}__kmpc_cancel_barrier169// CHECK: .cancel.continue5:170//171//172// CHECK-LABEL: define {{.+}}@main{{.+}} {173// CHECK: call {{.+}}parallel_taskgroup_loop{{.+}}()174// CHECK-NEXT: call {{.+}}parallel_taskwait_loop{{.+}}()175// CHECK-NEXT: call {{.+}}parallel_single_loop{{.+}}()176// CHECK-NEXT: call {{.+}}parallel_order_loop{{.+}}()177// CHECK-NEXT: call {{.+}}parallel_cancel_loop{{.+}}({{.+}}true)178// CHECK-NEXT: call {{.+}}parallel_cancel_loop{{.+}}({{.+}}false)179//180