148 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,NORMAL2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,NORMAL4// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG5// RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER6// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER8 9// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s10// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s11// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s12// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s13// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}14// expected-no-diagnostics15#ifndef HEADER16#define HEADER17 18// ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, ptr }19 20// ALL: define {{.*}}void [[FOO:@.+]]()21 22void foo() { extern void mayThrow(); mayThrow(); }23 24// ALL-LABEL: @main25// TERM_DEBUG-LABEL: @main26int main() {27 // ALL: [[A_ADDR:%.+]] = alloca i828 char a;29 30// ALL: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(ptr [[DEFAULT_LOC:@.+]])31// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]], i32 0)32// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 033// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]34// ALL: [[THEN]]35// ALL-NEXT: store i8 2, ptr [[A_ADDR]]36// IRBUILDER-NEXT: br label %[[AFTER:[^ ,]+]]37// IRBUILDER: [[AFTER]]38// IRBUILDER-NEXT: br label %[[OMP_REGION_FINALIZE:[^ ,]+]]39// IRBUILDER: [[OMP_REGION_FINALIZE]]40// ALL-NEXT: call {{.*}}void @__kmpc_end_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]])41// ALL-NEXT: br label {{%?}}[[EXIT]]42// ALL: [[EXIT]]43#pragma omp masked44 a = 2;45// IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(ptr [[DEFAULT_LOC:@.+]])46// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]], i32 2)47// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 048// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]49// ALL: [[THEN]]50// IRBUILDER-NEXT: call {{.*}}void [[FOO]]()51// NORMAL-NEXT: invoke {{.*}}void [[FOO]]()52// ALL: call {{.*}}void @__kmpc_end_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]])53// ALL-NEXT: br label {{%?}}[[EXIT]]54// ALL: [[EXIT]]55#pragma omp masked filter(2)56 foo();57// ALL: store i32 9, ptr [[X:.+]],58// ALL: [[X_VAL:%.+]] = load i32, ptr [[X]]59// IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(ptr [[DEFAULT_LOC:@.+]])60// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]], i32 [[X_VAL]])61// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 062// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]63// ALL: [[THEN]]64// IRBUILDER-NEXT: call {{.*}}void [[FOO]]()65// NORMAL-NEXT: invoke {{.*}}void [[FOO]]()66// ALL: call {{.*}}void @__kmpc_end_masked(ptr [[DEFAULT_LOC]], i32 [[GTID]])67// ALL-NEXT: br label {{%?}}[[EXIT]]68// ALL: [[EXIT]]69 int x = 9;70#pragma omp masked filter(x)71 foo();72 // ALL-NOT: call i32 @__kmpc_masked73 // ALL-NOT: call void @__kmpc_end_masked74 return a;75}76 77// ALL-LABEL: lambda_masked78// TERM_DEBUG-LABEL: lambda_masked79void lambda_masked(int a, int b) {80 auto l = [=]() {81#pragma omp masked82 {83 // ALL: call i32 @__kmpc_masked(84 int c = a + b;85 }86 };87 88 l();89 90 auto l1 = [=]() {91#pragma omp parallel92#pragma omp masked filter(1)93 {94 // ALL: call i32 @__kmpc_masked(95 int c = a + b;96 }97 };98 99 l1();100 101 int y = 1;102 auto l2 = [=](int yy) {103#pragma omp parallel104#pragma omp masked filter(yy)105 {106 // ALL: call i32 @__kmpc_masked(107 int c = a + b;108 }109 };110 111 l2(y);112}113 114// ALL-LABEL: parallel_masked115// TERM_DEBUG-LABEL: parallel_masked116void parallel_masked() {117#pragma omp parallel118#pragma omp masked filter(1)119 // TERM_DEBUG-NOT: __kmpc_global_thread_num120 // TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]121 // TERM_DEBUG: invoke void {{.*}}foo{{.*}}()122 // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],123 // TERM_DEBUG-NOT: __kmpc_global_thread_num124 // TERM_DEBUG: call void @__kmpc_end_masked({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]125 // TERM_DEBUG: [[TERM_LPAD]]126 // TERM_DEBUG: call void @__clang_call_terminate127 // TERM_DEBUG: unreachable128 foo();129 130 int x;131#pragma omp parallel132#pragma omp masked filter(x)133 // TERM_DEBUG-NOT: __kmpc_global_thread_num134 // TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]135 // TERM_DEBUG: invoke void {{.*}}foo{{.*}}()136 // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],137 // TERM_DEBUG-NOT: __kmpc_global_thread_num138 // TERM_DEBUG: call void @__kmpc_end_masked({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]139 // TERM_DEBUG: [[TERM_LPAD]]140 // TERM_DEBUG: call void @__clang_call_terminate141 // TERM_DEBUG: unreachable142 foo();143}144// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !DILocation(line: [[@LINE-12]],145// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !DILocation(line: [[@LINE-3]],146 147#endif148