diff options
author | Reid Kleckner <rnk@google.com> | 2019-12-04 14:50:06 -0800 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-12-04 14:50:06 -0800 |
commit | 33f6d465d790ac5c9b949e6bc05127d356212079 (patch) | |
tree | 99508efd07e3db1d9d326e7e0f7af23aaf1ed0c0 /clang/test/OpenMP/parallel_master_codegen.cpp | |
parent | 9c29aed6980dce42f2a071db09663c435ac21ad1 (diff) | |
download | bcm5719-llvm-33f6d465d790ac5c9b949e6bc05127d356212079.tar.gz bcm5719-llvm-33f6d465d790ac5c9b949e6bc05127d356212079.zip |
Revert "[OpenMP50] Add parallel master construct, by Chi Chun Chen."
This reverts commit 713dab21e27c987b9114547ce7136bac2e775de9.
Tests do not pass on Windows.
Diffstat (limited to 'clang/test/OpenMP/parallel_master_codegen.cpp')
-rw-r--r-- | clang/test/OpenMP/parallel_master_codegen.cpp | 471 |
1 files changed, 0 insertions, 471 deletions
diff --git a/clang/test/OpenMP/parallel_master_codegen.cpp b/clang/test/OpenMP/parallel_master_codegen.cpp deleted file mode 100644 index 710d4dce81b..00000000000 --- a/clang/test/OpenMP/parallel_master_codegen.cpp +++ /dev/null @@ -1,471 +0,0 @@ -// expected-no-diagnostics -#ifndef HEADER -#define HEADER - -#ifdef CK1 -///==========================================================================/// -// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK1 -// RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK1 -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-prefix CK1 - -// RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK1 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// CK1-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK1-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK1-DAG: [[DEF_LOC:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -// CK1-LABEL: foo -void foo() {} - -void parallel_master() { -#pragma omp parallel master - foo(); -} - -// CK1-LABEL: define void @{{.+}}parallel_master{{.+}} -// CK1: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*)) - -// CK1: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias %.global_tid., i32* noalias %.bound_tid.) -// CK1-NOT: __kmpc_global_thread_num -// CK1: call i32 @__kmpc_master({{.+}}) -// CK1: invoke void {{.*}}foo{{.*}}() -// CK1-NOT: __kmpc_global_thread_num -// CK1: call void @__kmpc_end_master({{.+}}) -// CK1: call void @__clang_call_terminate -// CK1: unreachable - -#endif - -#ifdef CK2 -///==========================================================================/// -// RUN: %clang_cc1 -DCK2 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK2 -// RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK2 -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-prefix CK2 - -// RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK2 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// CK2-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK2-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK2-DAG: [[DEF_LOC:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void parallel_master_private() { - int a; -#pragma omp parallel master private(a) - a++; -} - -// CK2-LABEL: define void @{{.+}}parallel_master_private{{.+}} -// CK2: [[A_PRIV:%.+]] = alloca i32 -// CK2: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*)) - -// CK2: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias %.global_tid., i32* noalias %.bound_tid.) -// CK2-NOT: __kmpc_global_thread_num -// CK2: call i32 @__kmpc_master({{.+}}) -// CK2: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV]] -// CK2: [[INC:%.+]] = add nsw i32 [[A_VAL]] -// CK2: store i32 [[INC]], i32* [[A_PRIV]] -// CK2-NOT: __kmpc_global_thread_num -// CK2: call void @__kmpc_end_master({{.+}}) -// CK2: ret void - -#endif - -#ifdef CK3 -///==========================================================================/// -// RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK3 -// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK3 -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-prefix CK3 - -// RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK3 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// CK3-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK3-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" - -void parallel_master_private() { - int a; -#pragma omp parallel master default(shared) - a++; -} - -// CK3-LABEL: define void @{{.+}}parallel_master{{.+}} -// CK3: [[A_VAL:%.+]] = alloca i32 -// CK3: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* {{.+}}, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OMP_OUTLINED:@.+]] to void - -// CK3: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4) [[A_VAL]]) -// CK3: %.global_tid..addr = alloca i32* -// CK3: %.bound_tid..addr = alloca i32* -// CK3: [[A_ADDR:%.+]] = alloca i32* -// CK3: store i32* %.global_tid., i32** %.global_tid..addr -// CK3: store i32* %.bound_tid., i32** %.bound_tid..addr -// CK3: store i32* [[A_VAL]], i32** [[A_ADDR]] -// CK3: [[ZERO:%.+]] = load i32*, i32** [[A_ADDR]] -// CK3-NOT: __kmpc_global_thread_num -// CK3: call i32 @__kmpc_master({{.+}}) -// CK3: [[FIVE:%.+]] = load i32, i32* [[ZERO]] -// CK3: [[INC:%.+]] = add nsw i32 [[FIVE]] -// CK3: store i32 [[INC]], i32* [[ZERO]] -// CK3-NOT: __kmpc_global_thread_num -// CK3: call void @__kmpc_end_master({{.+}}) - -#endif - -#ifdef CK4 -///==========================================================================/// -// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK4 -// RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK4 -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-prefix CK4 - -// RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK4 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// CK4-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK4-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK4-DAG: [[DEF_LOC:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void parallel_master_firstprivate() { - int a; -#pragma omp parallel master firstprivate(a) - a++; -} - -// CK4-LABEL: define void @{{.+}}parallel_master_firstprivate{{.+}} -// CK4: [[A_VAL:%.+]] = alloca i32 -// CK4: [[A_CASTED:%.+]] = alloca i64 -// CK4: [[ZERO:%.+]] = load i32, i32* [[A_VAL]] -// CK4: [[CONV:%.+]] = bitcast i64* [[A_CASTED]] to i32* -// CK4: store i32 [[ZERO]], i32* [[CONV]] -// CK4: [[ONE:%.+]] = load i64, i64* [[A_CASTED]] -// CK4: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i64 [[ONE]]) - -// CK4: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias [[GLOBAL_TID:%.+]], i32* noalias [[BOUND_TID:%.+]], i64 [[A_VAL]]) -// CK4: [[GLOBAL_TID_ADDR:%.+]] = alloca i32* -// CK4: [[BOUND_TID_ADDR:%.+]] = alloca i32* -// CK4: [[A_ADDR:%.+]] = alloca i64 -// CK4: store i32* [[GLOBAL_TID]], i32** [[GLOBAL_TID_ADDR]] -// CK4: store i32* [[BOUND_TID]], i32** [[BOUND_TID_ADDR]] -// CK4: store i64 [[A_VAL]], i64* [[A_ADDR]] -// CK4: [[CONV]] = bitcast i64* [[A_ADDR]] to i32* -// CK4-NOT: __kmpc_global_thread_num -// CK4: call i32 @__kmpc_master({{.+}}) -// CK4: [[FOUR:%.+]] = load i32, i32* [[CONV]] -// CK4: [[INC:%.+]] = add nsw i32 [[FOUR]] -// CK4: store i32 [[INC]], i32* [[CONV]] -// CK4-NOT: __kmpc_global_thread_num -// CK4: call void @__kmpc_end_master({{.+}}) - -#endif - -#ifdef CK5 -///==========================================================================/// -// RUN: %clang_cc1 -DCK5 -verify -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK5 -// RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK5 - -// RUN: %clang_cc1 -DCK5 -verify -fopenmp-simd -fnoopenmp-use-tls -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK5 -fopenmp-simd -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK5 -fopenmp-simd -fnoopenmp-use-tls -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// RUN: %clang_cc1 -DCK5 -verify -fopenmp -x c++ -triple x86_64-linux -emit-llvm %s -o - | FileCheck %s -check-prefix=TLS-CHECK -// RUN: %clang_cc1 -DCK5 -fopenmp -x c++ -std=c++11 -triple x86_64-linux -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK5 -fopenmp -x c++ -triple x86_64-linux -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TLS-CHECK - -// RUN: %clang_cc1 -DCK5 -verify -fopenmp-simd -x c++ -triple x86_64-linux -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s -// RUN: %clang_cc1 -DCK5 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-linux -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK5 -fopenmp-simd -x c++ -triple x86_64-linux -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s -// SIMD-ONLY1-NOT: {{__kmpc|__tgt}} - -// CK5-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK5-DAG: [[A:@.+]] = {{.+}} i32 0 -// CK5-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK5-DAG: [[DEF_LOC_1:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } -// CK5-DAG: [[A_CACHE:@.+]] = common global i8** null -// CK5-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 66, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } -// TLS-CHECK-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// TLS-CHECK-DAG: [[A:@.+]] = thread_local global i32 0 -// TLS-CHECK-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// TLS-CHECK-DAG: [[DEF_LOC_1:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 66, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } -// TLS-CHECK-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -int a; -#pragma omp threadprivate(a) - -void parallel_master_copyin() { -#pragma omp parallel master copyin(a) - a++; -} - -// CK5-LABEL: define void @{{.+}}parallel_master_copyin{{.+}} -// CK5: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC_1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*)) -// CK5: ret void -// TLS-CHECK-LABEL: define void @{{.+}}parallel_master_copyin{{.+}} -// TLS-CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC_2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*) -// TLS-CHECK: ret void - -// CK5: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias [[GLOBAL_TID:%.+]], i32* noalias [[BOUND_TID:%.+]]) -// CK5: [[GLOBAL_TID_ADDR:%.+]] = alloca i32* -// CK5: [[BOUND_TID_ADDR:%.+]] = alloca i32* -// CK5: store i32* [[GLOBAL_TID]], i32** [[GLOBAL_TID_ADDR]] -// CK5: store i32* [[BOUND_TID]], i32** [[BOUND_TID_ADDR]] -// CK5: [[ZERO:%.+]] = load i32*, i32** [[GLOBAL_TID_ADDR]] -// CK5: [[ONE:%.+]] = load i32, i32* [[ZERO]] -// CK5: [[TWO:%.+]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* [[DEF_LOC_1]], i32 [[ONE]], i8* bitcast (i32* [[A]] to i8*), i64 4, i8*** [[A_CACHE]]) -// CK5: [[THREE:%.+]] = bitcast i8* [[TWO]] to i32* -// CK5: [[FOUR:%.+]] = ptrtoint i32* [[THREE]] to i64 -// CK5: [[FIVE:%.+]] = icmp ne i64 ptrtoint (i32* [[A]] to i64), [[FOUR]] -// CK5: br i1 [[FIVE]], label [[COPYIN_NOT_MASTER:%.+]], label [[COPYIN_NOT_MASTER_END:%.+]] -// TLS-CHECK: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias [[GLOBAL_TID:%.+]], i32* noalias [[BOUND_TID:%.+]], i32* {{.+}} [[A_VAR:%.+]]) -// TLS-CHECK: [[GLOBAL_TID_ADDR:%.+]] = alloca i32* -// TLS-CHECK: [[BOUND_TID_ADDR:%.+]] = alloca i32* -// TLS-CHECK: [[A_ADDR:%.+]] = alloca i32* -// TLS-CHECK: store i32* [[A_VAR]], i32** [[A_ADDR]] -// TLS-CHECK: [[ZERO:%.+]] = load i32*, i32** [[A_ADDR]] -// TLS-CHECK: [[ONE:%.+]] = ptrtoint i32* [[ZERO]] to i64 -// TLS-CHECK: [[TWO:%.+]] = icmp ne i64 [[ONE]], ptrtoint (i32* [[A]] to i64) -// TLS-CHECK: br i1 [[TWO]], label [[COPYIN_NOT_MASTER:%.+]], label [[COPYIN_NOT_MASTER_END:%.+]] - -// CK5-DAG: [[COPYIN_NOT_MASTER]] -// CK5-DAG: [[SIX:%.+]] = load i32, i32* [[A]] -// TLS-CHECK-DAG: [[COPYIN_NOT_MASTER]] -// TLS-CHECK-DAG: [[THREE:%.+]] = load i32, i32* [[ZERO]] -// TLS-CHECK-DAG: store i32 [[THREE]], i32* [[A]] - -// CK5-DAG: [[COPYIN_NOT_MASTER_END]] -// CK5-DAG: call void @__kmpc_barrier(%struct.ident_t* [[DEF_LOC_2]], i32 [[ONE]]) -// CK5-DAG: [[SEVEN:%.+]] = call i32 @__kmpc_master(%struct.ident_t* [[DEF_LOC_1]], i32 [[ONE]]) -// CK5-DAG: [[EIGHT:%.+]] = icmp ne i32 [[SEVEN]], 0 -// CK5-DAG: br i1 %8, label [[OMP_IF_THEN:%.+]], label [[OMP_IF_END:%.+]] -// TLS-CHECK-DAG: [[FOUR:%.+]] = load i32*, i32** [[GLOBAL_TID_ADDR:%.+]] -// TLS-CHECK-DAG: [[FIVE:%.+]] = load i32, i32* [[FOUR]] -// TLS-CHECK-DAG: call void @__kmpc_barrier(%struct.ident_t* [[DEF_LOC_1]], i32 [[FIVE]]) -// TLS-CHECK-DAG: [[SIX:%.+]] = load i32*, i32** [[GLOBAL_TID_ADDR]] -// TLS-CHECK-DAG: [[SEVEN:%.+]] = load i32, i32* [[SIX]] -// TLS-CHECK-DAG: [[EIGHT:%.+]] = call i32 @__kmpc_master(%struct.ident_t* [[DEF_LOC_2]], i32 [[SEVEN]]) -// TLS-CHECK-DAG: [[NINE:%.+]] = icmp ne i32 [[EIGHT]], 0 -// TLS-CHECK-DAG: br i1 [[NINE]], label [[OMP_IF_THEN:%.+]], label [[OMP_IF_END:%.+]] - -// CK5-DAG: [[OMP_IF_THEN]] -// CK5-DAG: [[NINE:%.+]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* [[DEF_LOC_1]], i32 %1, i8* bitcast (i32* [[A]] to i8*), i64 4, i8*** [[A_CACHE]]) -// CK5-DAG: [[TEN:%.+]] = bitcast i8* [[NINE]] to i32* -// CK5-DAG: [[ELEVEN:%.+]] = load i32, i32* [[TEN]] -// CK5-DAG: [[INC:%.+]] = add nsw i32 [[ELEVEN]], 1 -// CK5-DAG: store i32 [[INC]], i32* [[TEN]] -// CK5-DAG: call void @__kmpc_end_master(%struct.ident_t* [[DEF_LOC_1]], i32 [[ONE]]) -// CK5-DAG: [[OMP_IF_END]] -// CK5-DAG: ret void - -// TLS-CHECK-DAG: [[OMP_IF_THEN]] -// TLS-CHECK-DAG: [[TEN:%.+]] = load i32, i32* [[A]] -// TLC-CHECK-DAG: %inc = add nsw i32 [[TEN]], 1 -// TLS-CHECK-DAG: store i32 %inc, i32* [[A]] -// TLS-CHECK-DAG: call void @__kmpc_end_master(%struct.ident_t* [[DEF_LOC_2]], i32 [[SEVEN]]) -// TLS-CHECK-DAG: [[OMP_IF_END]] -// TLS-CHECK-DAG: ret void - -#endif -#ifdef CK6 -///==========================================================================/// -// RUN: %clang_cc1 -DCK6 -verify -fopenmp -x c++ -triple x86_64-linux -emit-llvm %s -o - | FileCheck %s -check-prefix=CK6 -// RUN: %clang_cc1 -DCK6 -fopenmp -x c++ -std=c++11 -triple x86_64-linux -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK6 -fopenmp -x c++ -triple x86_64-linux -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=CK6 - -// RUN: %clang_cc1 -DCK6 -verify -fopenmp-simd -x c++ -triple x86_64-linux -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s -// RUN: %clang_cc1 -DCK6 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-linux -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK6 -fopenmp-simd -x c++ -triple x86_64-linux -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s -// SIMD-ONLY1-NOT: {{__kmpc|__tgt}} - -// CK6-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK6-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK6-DAG: [[DEF_LOC_1:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } -// CK6-DAG: [[GOMP:@.+]] = common global [8 x i32] zeroinitializer -// CK6-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 18, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void parallel_master_reduction() { - int g; -#pragma omp parallel master reduction(+:g) - g = 1; -} - -// CK6-LABEL: define void @{{.+}}parallel_master_reduction{{.+}} -// CK6: [[G_VAR:%.+]] = alloca i32 -// CK6: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC_1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i32* [[G_VAR]]) -// CK6: ret void - -// CK6: define internal void [[OMP_OUTLINED]](i32* noalias [[GLOBAL_TID:%.+]], i32* noalias [[BOUND_TID:%.+]], i32* {{.+}} [[G_VAR]]) -// CK6: %.global_tid..addr = alloca i32* -// CK6: %.bound_tid..addr = alloca i32* -// CK6: [[G_ADDR:%.+]] = alloca i32* -// CK6: [[G_1:%.+]] = alloca i32 -// CK6: [[RED_LIST:%.+]] = alloca [1 x i8*] -// CK6: [[ZERO:%.+]] = load i32*, i32** [[G_ADDR]] -// CK6: [[ONE:%.+]] = load i32*, i32** %.global_tid..addr -// CK6: [[TWO:%.+]] = load i32, i32* [[ONE]] -// CK6: [[THREE:%.+]] = call i32 @__kmpc_master(%struct.ident_t* [[DEF_LOC_1]], i32 [[TWO]]) -// CK6: [[FOUR:%.+]] = icmp ne i32 [[THREE]] - -// CK6: store i32 1, i32* [[G_1]] -// CK6: call void @__kmpc_end_master(%struct.ident_t* [[DEF_LOC_1]], i32 [[TWO]]) - -// CK6: [[FIVE:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST]], i64 0, i64 0 -// CK6: [[SEVEN:%.+]] = bitcast [1 x i8*]* [[RED_LIST]] to i8* -// CK6: [[EIGHT:%.+]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* [[DEF_LOC_2]], i32 [[TWO]], i32 1, i64 8, i8* [[SEVEN]], void (i8*, i8*)* [[RED_FUNC:@.+]], [8 x i32]* [[RED_VAR:@.+]]) - -// switch -// CK6: switch i32 [[EIGHT]], label [[RED_DEFAULT:%.+]] [ -// CK6: i32 1, label [[CASE1:%.+]] -// CK6: i32 2, label [[CASE2:%.+]] - -// case 1: -// CK6: [[NINE:%.+]] = load i32, i32* %0, align 4 -// CK6: [[TEN:%.+]] = load i32, i32* [[G_1]] -// CK6: [[ADD:%.+]] = add nsw i32 [[NINE]], [[TEN]] -// CK6: store i32 [[ADD]], i32* [[ZERO]] -// CK6: call void @__kmpc_end_reduce_nowait(%struct.ident_t* [[DEF_LOC_2]], i32 [[TWO]], [8 x i32]* [[GOMP]]) -// CK6: br label [[RED_DEFAULT]] - -// case 2: -// CK6: [[ELEVEN:%.+]] = load i32, i32* [[G_1]] -// CK6: [[TWELVE:%.+]] = atomicrmw add i32* [[ZERO]], i32 [[ELEVEN]] monotonic - -// CK6: define internal void [[RED_FUNC]](i8* [[ZERO]], i8* [[ONE]]) -// CK6: ret void -#endif -#ifdef CK7 -///==========================================================================/// -// RUN: %clang_cc1 -DCK7 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK7 -// RUN: %clang_cc1 -DCK7 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK7 -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-prefix CK7 - -// RUN: %clang_cc1 -DCK7 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK7 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK7 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -// CK7-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK7-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK7-DAG: [[DEF_LOC_1:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void parallel_master_if() { -#pragma omp parallel master if (parallel: false) - parallel_master_if(); -} - -// CK7-LABEL: parallel_master_if -// CK7: [[ZERO:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEF_LOC_1]]) -// CK7: call void @__kmpc_serialized_parallel(%struct.ident_t* [[DEF_LOC_1]], i32 [[ZERO]]) -// CK7: call void [[OUTLINED:@.+]](i32* [[THREAD_TEMP:%.+]], i32* [[BND_ADDR:%.+]]) -// CK7: call void @__kmpc_end_serialized_parallel(%struct.ident_t* [[DEF_LOC_1]], i32 [[ZERO]]) -// CK7: ret void - -// CK7: define internal void @.omp_outlined.(i32* noalias [[GTID:%.+]], i32* noalias [[BTID:%.+]]) -// CK7: [[EXECUTE:%.+]] = call i32 @__kmpc_master(%struct.ident_t* @0, i32 %1) -// CK7: call void @__kmpc_end_master(%struct.ident_t* [[DEF_LOC_1]], i32 %1) - -#endif -#ifdef CK8 -///==========================================================================/// -// RUN: %clang_cc1 -DCK8 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK8 -// RUN: %clang_cc1 -DCK8 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK8 -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-prefix CK8 - -// RUN: %clang_cc1 -DCK8 -verify -fopenmp-simd -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s -// RUN: %clang_cc1 -DCK8 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s -// RUN: %clang_cc1 -DCK8 -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 %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - -typedef __INTPTR_TYPE__ intptr_t; - -// CK8-DAG: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* } -// CK8-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK8-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr global [[IDENT_T_TY]] { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void foo(); - -struct S { - intptr_t a, b, c; - S(intptr_t a) : a(a) {} - operator char() { return a; } - ~S() {} -}; - -template <typename T> -T tmain() { -#pragma omp parallel master proc_bind(master) - foo(); - return T(); -} - -int main() { -#pragma omp parallel master proc_bind(spread) - foo(); -#pragma omp parallel master proc_bind(close) - foo(); - return tmain<int>(); -} - -// CK8-LABEL: @main -// CK8: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEF_LOC_2]]) -// CK8: call {{.*}}void @__kmpc_push_proc_bind([[IDENT_T_TY]]* [[DEF_LOC_2]], i32 [[GTID]], i32 4) -// CK8: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( -// CK8: call {{.*}}void @__kmpc_push_proc_bind([[IDENT_T_TY]]* [[DEF_LOC_2]], i32 [[GTID]], i32 3) -// CK8: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( - -// CK8-LABEL: @{{.+}}tmain -// CK8: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEF_LOC_2]]) -// CK8: call {{.*}}void @__kmpc_push_proc_bind([[IDENT_T_TY]]* [[DEF_LOC_2]], i32 [[GTID]], i32 2) -// CK8: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( -// CK8: ret i32 0 -// CK8-NEXT: } - -// CK8: call i32 @__kmpc_master(%struct.ident_t* [[DEF_LOC_2]], i32 [[ONE:%.+]]) -// CK8: call void @__kmpc_end_master(%struct.ident_t* [[DEF_LOC_2]], i32 [[ONE]]) - -#endif -#ifdef CK9 -// CK9-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* } -// CK9-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00" -// CK9-DAG: [[DEF_LOC:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) } - -void parallel_master_firstprivate() { - int a; -#pragma omp parallel master firstprivate(a) allocate(a) - a++; -} - -// CK9-LABEL: define void @{{.+}}parallel_master_firstprivate{{.+}} -// CK9: [[A_VAL:%.+]] = alloca i32 -// CK9: [[A_CASTED:%.+]] = alloca i64 -// CK9: [[ZERO:%.+]] = load i32, i32* [[A_VAL]] -// CK9: [[CONV:%.+]] = bitcast i64* [[A_CASTED]] to i32* -// CK9: store i32 [[ZERO]], i32* [[CONV]] -// CK9: [[ONE:%.+]] = load i64, i64* [[A_CASTED]] -// CK9: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEF_LOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i64 [[ONE]]) - -// CK9: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias [[GLOBAL_TID:%.+]], i32* noalias [[BOUND_TID:%.+]], i64 [[A_VAL]]) -// CK9: [[GLOBAL_TID_ADDR:%.+]] = alloca i32* -// CK9: [[BOUND_TID_ADDR:%.+]] = alloca i32* -// CK9: [[A_ADDR:%.+]] = alloca i64 -// CK9: store i32* [[GLOBAL_TID]], i32** [[GLOBAL_TID_ADDR]] -// CK9: store i32* [[BOUND_TID]], i32** [[BOUND_TID_ADDR]] -// CK9: store i64 [[A_VAL]], i64* [[A_ADDR]] -// CK9: [[CONV]] = bitcast i64* [[A_ADDR]] to i32* -// CK9-NOT: __kmpc_global_thread_num -// CK9: call i32 @__kmpc_master({{.+}}) -// CK9: [[FOUR:%.+]] = load i32, i32* [[CONV]] -// CK9: [[INC:%.+]] = add nsw i32 [[FOUR]] -// CK9: store i32 [[INC]], i32* [[CONV]] -// CK9-NOT: __kmpc_global_thread_num -// CK9: call void @__kmpc_end_master({{.+}}) -#endif -#endif |