Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s |
Samuel Antao | f8b5012 | 2015-07-13 22:54:53 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s |
| 3 | // RUN: %clang_cc1 -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 |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 4 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -std=c++11 -fopenmp -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG |
Samuel Antao | f8b5012 | 2015-07-13 22:54:53 +0000 | [diff] [blame] | 5 | // RUN: %clang_cc1 -verify -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=ARRAY %s |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 6 | // expected-no-diagnostics |
Adrian Prantl | bc06858 | 2015-07-08 01:00:30 +0000 | [diff] [blame] | 7 | // REQUIRES: x86-registered-target |
Alexey Bataev | 1d9c15c | 2015-05-19 12:31:28 +0000 | [diff] [blame] | 8 | #ifndef ARRAY |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 9 | #ifndef HEADER |
| 10 | #define HEADER |
| 11 | |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 12 | class TestClass { |
| 13 | public: |
| 14 | int a; |
| 15 | TestClass() : a(0) {} |
| 16 | TestClass(const TestClass &C) : a(C.a) {} |
| 17 | TestClass &operator=(const TestClass &) { return *this;} |
| 18 | ~TestClass(){}; |
| 19 | }; |
| 20 | |
| 21 | // CHECK-DAG: [[TEST_CLASS_TY:%.+]] = type { i{{[0-9]+}} } |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 22 | // CHECK-DAG: [[SST_TY:%.+]] = type { double } |
| 23 | // CHECK-DAG: [[SS_TY:%.+]] = type { i32, i8, i32* } |
| 24 | // CHECK-DAG: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* } |
Alexey Bataev | f268568 | 2015-03-30 04:30:22 +0000 | [diff] [blame] | 25 | // CHECK: [[IMPLICIT_BARRIER_SINGLE_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8* |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 26 | |
| 27 | // CHECK: define void [[FOO:@.+]]() |
| 28 | |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 29 | TestClass tc; |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 30 | TestClass tc2[2]; |
| 31 | #pragma omp threadprivate(tc, tc2) |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 32 | |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 33 | void foo() {} |
| 34 | |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 35 | struct SS { |
| 36 | int a; |
| 37 | int b : 4; |
| 38 | int &c; |
| 39 | SS(int &d) : a(0), b(0), c(d) { |
| 40 | #pragma omp parallel firstprivate(a, b, c) |
| 41 | #pragma omp single copyprivate(a, this->b, (this)->c) |
| 42 | [&]() { |
| 43 | ++this->a, --b, (this)->c /= 1; |
| 44 | #pragma omp parallel firstprivate(a, b, c) |
| 45 | #pragma omp single copyprivate(a, this->b, (this)->c) |
| 46 | ++(this)->a, --b, this->c /= 1; |
| 47 | }(); |
| 48 | } |
| 49 | }; |
| 50 | |
| 51 | template<typename T> |
| 52 | struct SST { |
| 53 | T a; |
| 54 | SST() : a(T()) { |
| 55 | #pragma omp parallel firstprivate(a) |
| 56 | #pragma omp single copyprivate(this->a) |
| 57 | [&]() { |
| 58 | [&]() { |
| 59 | ++this->a; |
| 60 | #pragma omp parallel firstprivate(a) |
| 61 | #pragma omp single copyprivate((this)->a) |
| 62 | ++(this)->a; |
| 63 | }(); |
| 64 | }(); |
| 65 | } |
| 66 | }; |
| 67 | |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 68 | // CHECK-LABEL: @main |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 69 | // TERM_DEBUG-LABEL: @main |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 70 | int main() { |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 71 | // CHECK-DAG: [[A_ADDR:%.+]] = alloca i8 |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 72 | // CHECK-DAG: [[A2_ADDR:%.+]] = alloca [2 x i8] |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 73 | // CHECK-DAG: [[C_ADDR:%.+]] = alloca [[TEST_CLASS_TY]] |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 74 | char a; |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 75 | char a2[2]; |
Alexey Bataev | caacd53 | 2015-09-04 11:26:21 +0000 | [diff] [blame] | 76 | TestClass &c = tc; |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 77 | SST<double> sst; |
| 78 | SS ss(c.a); |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 79 | |
| 80 | // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]]) |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 81 | // CHECK-DAG: [[DID_IT:%.+]] = alloca i32, |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 82 | // CHECK-DAG: [[COPY_LIST:%.+]] = alloca [5 x i8*], |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 83 | |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 84 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
| 85 | // CHECK-NEXT: [[IS_SINGLE:%.+]] = icmp ne i32 [[RES]], 0 |
| 86 | // CHECK-NEXT: br i1 [[IS_SINGLE]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] |
| 87 | // CHECK: [[THEN]] |
| 88 | // CHECK-NEXT: store i8 2, i8* [[A_ADDR]] |
| 89 | // CHECK-NEXT: call void @__kmpc_end_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
| 90 | // CHECK-NEXT: br label {{%?}}[[EXIT]] |
| 91 | // CHECK: [[EXIT]] |
Alexey Bataev | 8b72566 | 2015-04-24 04:00:39 +0000 | [diff] [blame] | 92 | // CHECK-NOT: call {{.+}} @__kmpc_cancel_barrier |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 93 | #pragma omp single nowait |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 94 | a = 2; |
| 95 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
| 96 | // CHECK-NEXT: [[IS_SINGLE:%.+]] = icmp ne i32 [[RES]], 0 |
| 97 | // CHECK-NEXT: br i1 [[IS_SINGLE]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] |
| 98 | // CHECK: [[THEN]] |
Alexey Bataev | 8b72566 | 2015-04-24 04:00:39 +0000 | [diff] [blame] | 99 | // CHECK-NEXT: store i8 2, i8* [[A_ADDR]] |
| 100 | // CHECK-NEXT: call void @__kmpc_end_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
| 101 | // CHECK-NEXT: br label {{%?}}[[EXIT]] |
| 102 | // CHECK: [[EXIT]] |
Alexey Bataev | 81c7ea0 | 2015-07-03 09:56:58 +0000 | [diff] [blame] | 103 | // CHECK: call{{.*}} @__kmpc_barrier([[IDENT_T_TY]]* [[IMPLICIT_BARRIER_SINGLE_LOC]], i32 [[GTID]]) |
Alexey Bataev | 8b72566 | 2015-04-24 04:00:39 +0000 | [diff] [blame] | 104 | #pragma omp single |
| 105 | a = 2; |
Alexey Bataev | 66beaa9 | 2015-04-30 03:47:32 +0000 | [diff] [blame] | 106 | // CHECK: store i32 0, i32* [[DID_IT]] |
Alexey Bataev | 8b72566 | 2015-04-24 04:00:39 +0000 | [diff] [blame] | 107 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
| 108 | // CHECK-NEXT: [[IS_SINGLE:%.+]] = icmp ne i32 [[RES]], 0 |
| 109 | // CHECK-NEXT: br i1 [[IS_SINGLE]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] |
| 110 | // CHECK: [[THEN]] |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 111 | // CHECK-NEXT: invoke void [[FOO]]() |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 112 | // CHECK: to label {{%?}}[[CONT:.+]] unwind |
| 113 | // CHECK: [[CONT]] |
Alexey Bataev | f539faa | 2016-03-28 12:58:34 +0000 | [diff] [blame] | 114 | // CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]]) |
Alexey Bataev | 14fa1c6 | 2016-03-29 05:34:15 +0000 | [diff] [blame] | 115 | // CHECK: store i32 1, i32* [[DID_IT]] |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 116 | // CHECK-NEXT: br label {{%?}}[[EXIT]] |
| 117 | // CHECK: [[EXIT]] |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 118 | // CHECK: [[A_PTR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[COPY_LIST]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 119 | // CHECK: store i8* [[A_ADDR]], i8** [[A_PTR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 120 | // CHECK: [[C_PTR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[COPY_LIST]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 |
Alexey Bataev | caacd53 | 2015-09-04 11:26:21 +0000 | [diff] [blame] | 121 | // CHECK: store i8* {{.+}}, i8** [[C_PTR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 122 | // CHECK: [[TC_PTR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[COPY_LIST]], i{{[0-9]+}} 0, i{{[0-9]+}} 2 |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 123 | // CHECK: [[TC_THREADPRIVATE_ADDR_VOID_PTR:%.+]] = call{{.*}} i8* @__kmpc_threadprivate_cached |
| 124 | // CHECK: [[TC_THREADPRIVATE_ADDR:%.+]] = bitcast i8* [[TC_THREADPRIVATE_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 125 | // CHECK: [[TC_PTR_REF_VOID_PTR:%.+]] = bitcast [[TEST_CLASS_TY]]* [[TC_THREADPRIVATE_ADDR]] to i8* |
| 126 | // CHECK: store i8* [[TC_PTR_REF_VOID_PTR]], i8** [[TC_PTR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 127 | // CHECK: [[A2_PTR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[COPY_LIST]], i{{[0-9]+}} 0, i{{[0-9]+}} 3 |
| 128 | // CHECK: [[BITCAST:%.+]] = bitcast [2 x i8]* [[A2_ADDR]] to i8* |
| 129 | // CHECK: store i8* [[BITCAST]], i8** [[A2_PTR_REF]], |
| 130 | // CHECK: [[TC2_PTR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[COPY_LIST]], i{{[0-9]+}} 0, i{{[0-9]+}} 4 |
| 131 | // CHECK: [[TC2_THREADPRIVATE_ADDR_VOID_PTR:%.+]] = call{{.*}} i8* @__kmpc_threadprivate_cached |
| 132 | // CHECK: [[TC2_THREADPRIVATE_ADDR:%.+]] = bitcast i8* [[TC2_THREADPRIVATE_ADDR_VOID_PTR]] to [2 x [[TEST_CLASS_TY]]]* |
| 133 | // CHECK: [[TC2_PTR_REF_VOID_PTR:%.+]] = bitcast [2 x [[TEST_CLASS_TY]]]* [[TC2_THREADPRIVATE_ADDR]] to i8* |
| 134 | // CHECK: store i8* [[TC2_PTR_REF_VOID_PTR]], i8** [[TC2_PTR_REF]], |
| 135 | // CHECK: [[COPY_LIST_VOID_PTR:%.+]] = bitcast [5 x i8*]* [[COPY_LIST]] to i8* |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 136 | // CHECK: [[DID_IT_VAL:%.+]] = load i32, i32* [[DID_IT]], |
Alexey Bataev | 66beaa9 | 2015-04-30 03:47:32 +0000 | [diff] [blame] | 137 | // CHECK: call void @__kmpc_copyprivate([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i64 40, i8* [[COPY_LIST_VOID_PTR]], void (i8*, i8*)* [[COPY_FUNC:@.+]], i32 [[DID_IT_VAL]]) |
Alexey Bataev | 8b72566 | 2015-04-24 04:00:39 +0000 | [diff] [blame] | 138 | // CHECK-NOT: call {{.+}} @__kmpc_cancel_barrier |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 139 | #pragma omp single copyprivate(a, c, tc, a2, tc2) |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 140 | foo(); |
| 141 | // CHECK-NOT: call i32 @__kmpc_single |
| 142 | // CHECK-NOT: call void @__kmpc_end_single |
| 143 | return a; |
| 144 | } |
| 145 | |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 146 | // CHECK: void [[COPY_FUNC]](i8*, i8*) |
| 147 | // CHECK: store i8* %0, i8** [[DST_ADDR_REF:%.+]], |
| 148 | // CHECK: store i8* %1, i8** [[SRC_ADDR_REF:%.+]], |
| 149 | // CHECK: [[DST_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[DST_ADDR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 150 | // CHECK: [[DST_ADDR:%.+]] = bitcast i8* [[DST_ADDR_VOID_PTR]] to [5 x i8*]* |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 151 | // CHECK: [[SRC_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[SRC_ADDR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 152 | // CHECK: [[SRC_ADDR:%.+]] = bitcast i8* [[SRC_ADDR_VOID_PTR]] to [5 x i8*]* |
| 153 | // CHECK: [[DST_A_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DST_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 154 | // CHECK: [[DST_A_ADDR:%.+]] = load i8*, i8** [[DST_A_ADDR_REF]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 155 | // CHECK: [[SRC_A_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[SRC_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 |
| 156 | // CHECK: [[SRC_A_ADDR:%.+]] = load i8*, i8** [[SRC_A_ADDR_REF]], |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 157 | // CHECK: [[SRC_A_VAL:%.+]] = load i8, i8* [[SRC_A_ADDR]], |
| 158 | // CHECK: store i8 [[SRC_A_VAL]], i8* [[DST_A_ADDR]], |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 159 | // CHECK: [[DST_C_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DST_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 |
| 160 | // CHECK: [[DST_C_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[DST_C_ADDR_REF]], |
| 161 | // CHECK: [[DST_C_ADDR:%.+]] = bitcast i8* [[DST_C_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 162 | // CHECK: [[SRC_C_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[SRC_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 |
| 163 | // CHECK: [[SRC_C_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[SRC_C_ADDR_REF]], |
| 164 | // CHECK: [[SRC_C_ADDR:%.+]] = bitcast i8* [[SRC_C_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 165 | // CHECK: call{{.*}} [[TEST_CLASS_TY_ASSIGN:@.+]]([[TEST_CLASS_TY]]* [[DST_C_ADDR]], [[TEST_CLASS_TY]]* {{.*}}[[SRC_C_ADDR]]) |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 166 | // CHECK: [[DST_TC_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DST_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 2 |
| 167 | // CHECK: [[DST_TC_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[DST_TC_ADDR_REF]], |
| 168 | // CHECK: [[DST_TC_ADDR:%.+]] = bitcast i8* [[DST_TC_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 169 | // CHECK: [[SRC_TC_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[SRC_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 2 |
| 170 | // CHECK: [[SRC_TC_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[SRC_TC_ADDR_REF]], |
| 171 | // CHECK: [[SRC_TC_ADDR:%.+]] = bitcast i8* [[SRC_TC_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 172 | // CHECK: call{{.*}} [[TEST_CLASS_TY_ASSIGN]]([[TEST_CLASS_TY]]* [[DST_TC_ADDR]], [[TEST_CLASS_TY]]* {{.*}}[[SRC_TC_ADDR]]) |
| 173 | // CHECK: [[DST_A2_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DST_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 3 |
| 174 | // CHECK: [[DST_A2_ADDR:%.+]] = load i8*, i8** [[DST_A2_ADDR_REF]], |
| 175 | // CHECK: [[SRC_A2_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[SRC_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 3 |
| 176 | // CHECK: [[SRC_A2_ADDR:%.+]] = load i8*, i8** [[SRC_A2_ADDR_REF]], |
Pete Cooper | 3b39e88 | 2015-11-19 05:55:59 +0000 | [diff] [blame] | 177 | // CHECK: call void @llvm.memcpy.{{.+}}(i8* [[DST_A2_ADDR]], i8* [[SRC_A2_ADDR]], i{{[0-9]+}} 2, i{{[0-9]+}} 1, i1 false) |
Alexey Bataev | 420d45b | 2015-04-14 05:11:24 +0000 | [diff] [blame] | 178 | // CHECK: [[DST_TC2_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DST_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 4 |
| 179 | // CHECK: [[DST_TC2_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[DST_TC2_ADDR_REF]], |
| 180 | // CHECK: [[DST_TC2_ADDR:%.+]] = bitcast i8* [[DST_TC2_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 181 | // CHECK: [[SRC_TC2_ADDR_REF:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[SRC_ADDR]], i{{[0-9]+}} 0, i{{[0-9]+}} 4 |
| 182 | // CHECK: [[SRC_TC2_ADDR_VOID_PTR:%.+]] = load i8*, i8** [[SRC_TC2_ADDR_REF]], |
| 183 | // CHECK: [[SRC_TC2_ADDR:%.+]] = bitcast i8* [[SRC_TC2_ADDR_VOID_PTR]] to [[TEST_CLASS_TY]]* |
| 184 | // CHECK: br i1 |
| 185 | // CHECK: call{{.*}} [[TEST_CLASS_TY_ASSIGN]]([[TEST_CLASS_TY]]* %{{.+}}, [[TEST_CLASS_TY]]* {{.*}}) |
| 186 | // CHECK: br i1 |
Alexey Bataev | a63048e | 2015-03-23 06:18:07 +0000 | [diff] [blame] | 187 | // CHECK: ret void |
| 188 | |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 189 | // CHECK-LABEL: parallel_single |
| 190 | // TERM_DEBUG-LABEL: parallel_single |
| 191 | void parallel_single() { |
Alexey Bataev | 8cbe0a6 | 2015-02-26 10:27:34 +0000 | [diff] [blame] | 192 | #pragma omp parallel |
| 193 | #pragma omp single |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 194 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 195 | // TERM_DEBUG: call i32 @__kmpc_single({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] |
| 196 | // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() |
| 197 | // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], |
| 198 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 199 | // TERM_DEBUG: call void @__kmpc_end_single({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]] |
Alexey Bataev | da19af4 | 2015-03-10 05:28:46 +0000 | [diff] [blame] | 200 | // TERM_DEBUG: [[TERM_LPAD]] |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 201 | // TERM_DEBUG: call void @__clang_call_terminate |
| 202 | // TERM_DEBUG: unreachable |
| 203 | foo(); |
Alexey Bataev | 8cbe0a6 | 2015-02-26 10:27:34 +0000 | [diff] [blame] | 204 | } |
Duncan P. N. Exon Smith | 9dd4e4e | 2015-04-29 16:40:08 +0000 | [diff] [blame] | 205 | // TERM_DEBUG-DAG: [[DBG_LOC_START]] = !DILocation(line: [[@LINE-12]], |
| 206 | // TERM_DEBUG-DAG: [[DBG_LOC_END]] = !DILocation(line: [[@LINE-3]], |
Alexey Bataev | 1d9c15c | 2015-05-19 12:31:28 +0000 | [diff] [blame] | 207 | #endif |
| 208 | #else |
| 209 | // ARRAY-LABEL: array_func |
| 210 | struct St { |
| 211 | int a, b; |
| 212 | St() : a(0), b(0) {} |
| 213 | St &operator=(const St &) { return *this; }; |
| 214 | ~St() {} |
| 215 | }; |
Alexey Bataev | 8cbe0a6 | 2015-02-26 10:27:34 +0000 | [diff] [blame] | 216 | |
Alexey Bataev | 5129d3a | 2015-05-21 09:47:46 +0000 | [diff] [blame] | 217 | void array_func(int n, int a[n], St s[2]) { |
Alexey Bataev | 1d9c15c | 2015-05-19 12:31:28 +0000 | [diff] [blame] | 218 | // ARRAY: call void @__kmpc_copyprivate(%ident_t* @{{.+}}, i32 %{{.+}}, i64 16, i8* %{{.+}}, void (i8*, i8*)* [[CPY:@.+]], i32 %{{.+}}) |
| 219 | #pragma omp single copyprivate(a, s) |
| 220 | ; |
| 221 | } |
| 222 | // ARRAY: define internal void [[CPY]] |
Alexey Bataev | 5129d3a | 2015-05-21 09:47:46 +0000 | [diff] [blame] | 223 | // ARRAY: store i32* %{{.+}}, i32** %{{.+}}, |
| 224 | // ARRAY: store %struct.St* %{{.+}}, %struct.St** %{{.+}}, |
Alexey Bataev | 6956e2e | 2015-02-05 06:35:41 +0000 | [diff] [blame] | 225 | #endif |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 226 | |
| 227 | // CHECK-LABEL:@_ZN2SSC2ERi( |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 228 | // CHECK: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SS_TY]]*, i64, i64, i64)* [[SS_MICROTASK:@.+]] to void |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 229 | // CHECK-NEXT: ret void |
| 230 | |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 231 | // CHECK: define internal void [[SS_MICROTASK]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SS_TY]]* {{.+}}, i64 {{.+}}, i64 {{.+}}, i64 {{.+}}) |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 232 | // Private a |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 233 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 234 | // Private b |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 235 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 236 | // Private c |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 237 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 238 | // CHECK: alloca i32*, |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 239 | // CHECK: alloca i32*, |
| 240 | // CHECK: alloca i32*, |
| 241 | // CHECK: alloca i32*, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 242 | // CHECK: [[DID_IT:%.+]] = alloca i32, |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 243 | // CHECK: bitcast i64* %{{.+}} to i32* |
| 244 | // CHECK: bitcast i64* %{{.+}} to i32* |
| 245 | // CHECK: bitcast i64* %{{.+}} to i32* |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 246 | // CHECK: store i32 0, i32* [[DID_IT]], |
| 247 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
| 248 | // CHECK-NEXT: icmp ne i32 [[RES]], 0 |
| 249 | // CHECK-NEXT: br i1 |
| 250 | |
| 251 | // CHECK: getelementptr inbounds [[CAP_TY:%.+]], [[CAP_TY]]* [[CAP:%.+]], i32 0, i32 0 |
| 252 | // CHECK: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 1 |
| 253 | // CHECK-NEXT: load i32*, i32** % |
| 254 | // CHECK-NEXT: store i32* % |
| 255 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 2 |
| 256 | // CHECK-NEXT: store i32* % |
| 257 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 3 |
| 258 | // CHECK-NEXT: load i32*, i32** % |
| 259 | // CHECK-NEXT: store i32* % |
| 260 | // CHECK-LABEL: invoke void @_ZZN2SSC1ERiENKUlvE_clEv( |
| 261 | // CHECK-SAME: [[CAP_TY]]* [[CAP]]) |
| 262 | |
Alexey Bataev | f539faa | 2016-03-28 12:58:34 +0000 | [diff] [blame] | 263 | // CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
Alexey Bataev | 14fa1c6 | 2016-03-29 05:34:15 +0000 | [diff] [blame] | 264 | // CHECK: store i32 1, i32* [[DID_IT]], |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 265 | // CHECK: br label |
| 266 | |
| 267 | // CHECK: call void @__kmpc_end_single(%{{.+}}* @{{.+}}, i32 %{{.+}}) |
| 268 | // CHECK: br label |
| 269 | |
| 270 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST:%.+]], i64 0, i64 0 |
| 271 | // CHECK: load i32*, i32** % |
| 272 | // CHECK-NEXT: bitcast i32* % |
| 273 | // CHECK-NEXT: store i8* % |
| 274 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST]], i64 0, i64 1 |
| 275 | // CHECK-NEXT: bitcast i32* % |
| 276 | // CHECK-NEXT: store i8* % |
| 277 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST]], i64 0, i64 2 |
| 278 | // CHECK: load i32*, i32** % |
| 279 | // CHECK-NEXT: bitcast i32* % |
| 280 | // CHECK-NEXT: store i8* % |
| 281 | // CHECK-NEXT: bitcast [3 x i8*]* [[LIST]] to i8* |
| 282 | // CHECK-NEXT: load i32, i32* [[DID_IT]], |
| 283 | // CHECK-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 24, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) |
| 284 | // CHECK-NEXT: ret void |
| 285 | |
| 286 | // CHECK-LABEL: @_ZZN2SSC1ERiENKUlvE_clEv( |
| 287 | // CHECK: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP:%.+]], i32 0, i32 1 |
| 288 | // CHECK-NEXT: load i32*, i32** % |
| 289 | // CHECK-NEXT: load i32, i32* % |
| 290 | // CHECK-NEXT: add nsw i32 %{{.+}}, 1 |
| 291 | // CHECK-NEXT: store i32 % |
| 292 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 2 |
| 293 | // CHECK-NEXT: load i32*, i32** % |
| 294 | // CHECK-NEXT: load i32, i32* % |
| 295 | // CHECK-NEXT: add nsw i32 %{{.+}}, -1 |
| 296 | // CHECK-NEXT: store i32 % |
| 297 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 3 |
| 298 | // CHECK-NEXT: load i32*, i32** % |
| 299 | // CHECK-NEXT: load i32, i32* % |
| 300 | // CHECK-NEXT: sdiv i32 %{{.+}}, 1 |
| 301 | // CHECK-NEXT: store i32 % |
| 302 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 1 |
| 303 | // CHECK-NEXT: load i32*, i32** % |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 304 | // CHECK-NEXT: load i32, i32* % |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 305 | // CHECK-NEXT: bitcast i64* % |
| 306 | // CHECK-NEXT: store i32 %{{.+}}, i32* % |
| 307 | // CHECK-NEXT: load i64, i64* % |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 308 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 2 |
| 309 | // CHECK-NEXT: load i32*, i32** % |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 310 | // CHECK-NEXT: load i32, i32* % |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 311 | // CHECK-NEXT: bitcast i64* % |
| 312 | // CHECK-NEXT: store i32 %{{.+}}, i32* % |
| 313 | // CHECK-NEXT: load i64, i64* % |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 314 | // CHECK-NEXT: getelementptr inbounds [[CAP_TY]], [[CAP_TY]]* [[CAP]], i32 0, i32 3 |
| 315 | // CHECK-NEXT: load i32*, i32** % |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 316 | // CHECK-NEXT: load i32, i32* % |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 317 | // CHECK-NEXT: bitcast i64* % |
| 318 | // CHECK-NEXT: store i32 %{{.+}}, i32* % |
| 319 | // CHECK-NEXT: load i64, i64* % |
| 320 | // CHECK-NEXT: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SS_TY]]*, i64, i64, i64)* [[SS_MICROTASK1:@.+]] to void |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 321 | // CHECK-NEXT: ret void |
| 322 | |
| 323 | // CHECK: define internal void [[COPY_FUNC]](i8*, i8*) |
| 324 | // CHECK: ret void |
| 325 | |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 326 | // CHECK: define internal void [[SS_MICROTASK1]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SS_TY]]* {{.+}}, i64 {{.+}}, i64 {{.+}}, i64 {{.+}}) |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 327 | // Private a |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 328 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 329 | // Private b |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 330 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 331 | // Private c |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 332 | // CHECK: alloca i64, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 333 | // CHECK: alloca i32*, |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 334 | // CHECK: alloca i32*, |
| 335 | // CHECK: alloca i32*, |
| 336 | // CHECK: alloca i32*, |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 337 | // CHECK: [[DID_IT:%.+]] = alloca i32, |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 338 | // CHECK: bitcast i64* %{{.+}} to i32* |
| 339 | // CHECK: bitcast i64* %{{.+}} to i32* |
| 340 | // CHECK: bitcast i64* %{{.+}} to i32* |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 341 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
| 342 | // CHECK-NEXT: icmp ne i32 [[RES]], 0 |
| 343 | // CHECK-NEXT: br i1 |
| 344 | |
| 345 | // CHECK-NOT: getelementptr inbounds |
| 346 | // CHECK: load i32*, i32** % |
| 347 | // CHECK-NEXT: load i32, i32* % |
| 348 | // CHECK-NEXT: add nsw i32 %{{.+}}, 1 |
| 349 | // CHECK-NEXT: store i32 % |
| 350 | // CHECK-NOT: getelementptr inbounds |
| 351 | // CHECK: load i32, i32* % |
| 352 | // CHECK-NEXT: add nsw i32 %{{.+}}, -1 |
| 353 | // CHECK-NEXT: store i32 % |
| 354 | // CHECK-NOT: getelementptr inbounds |
| 355 | // CHECK: load i32*, i32** % |
| 356 | // CHECK-NEXT: load i32, i32* % |
| 357 | // CHECK-NEXT: sdiv i32 %{{.+}}, 1 |
| 358 | // CHECK-NEXT: store i32 % |
Alexey Bataev | f539faa | 2016-03-28 12:58:34 +0000 | [diff] [blame] | 359 | // CHECK-NEXT: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
Alexey Bataev | 14fa1c6 | 2016-03-29 05:34:15 +0000 | [diff] [blame] | 360 | // CHECK-NEXT: store i32 1, i32* [[DID_IT]], |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 361 | // CHECK-NEXT: br label |
| 362 | |
| 363 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST:%.+]], i64 0, i64 0 |
| 364 | // CHECK: load i32*, i32** % |
| 365 | // CHECK-NEXT: bitcast i32* % |
| 366 | // CHECK-NEXT: store i8* % |
| 367 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST]], i64 0, i64 1 |
| 368 | // CHECK-NEXT: bitcast i32* % |
| 369 | // CHECK-NEXT: store i8* % |
| 370 | // CHECK: getelementptr inbounds [3 x i8*], [3 x i8*]* [[LIST]], i64 0, i64 2 |
| 371 | // CHECK: load i32*, i32** % |
| 372 | // CHECK-NEXT: bitcast i32* % |
| 373 | // CHECK-NEXT: store i8* % |
| 374 | // CHECK-NEXT: bitcast [3 x i8*]* [[LIST]] to i8* |
| 375 | // CHECK-NEXT: load i32, i32* [[DID_IT]], |
| 376 | // CHECK-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 24, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) |
| 377 | // CHECK-NEXT: ret void |
| 378 | |
| 379 | // CHECK: define internal void [[COPY_FUNC]](i8*, i8*) |
| 380 | // CHECK: ret void |
| 381 | |
| 382 | // CHECK-LABEL: @_ZN3SSTIdEC2Ev |
| 383 | // CHECK: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 |
| 384 | // CHECK-NEXT: store double 0.000000e+00, double* % |
| 385 | // CHECK-NEXT: getelementptr inbounds [[SST_TY]], [[SST_TY]]* %{{.+}}, i32 0, i32 0 |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 386 | // CHECK-NEXT: store double* %{{.+}}, double** % |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 387 | // CHECK-NEXT: load double*, double** % |
Alexey Bataev | 7ace49d | 2016-05-17 08:55:33 +0000 | [diff] [blame] | 388 | // CHECK-NEXT: load double, double* % |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 389 | // CHECK-NEXT: bitcast i64* %{{.+}} to double* |
| 390 | // CHECK-NEXT: store double %{{.+}}, double* % |
| 391 | // CHECK-NEXT: load i64, i64* % |
| 392 | // CHECK-NEXT: call void ([[IDENT_T_TY]]*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call([[IDENT_T_TY]]* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[SST_TY]]*, i64)* [[SST_MICROTASK:@.+]] to void |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 393 | // CHECK-NEXT: ret void |
| 394 | |
Samuel Antao | 6d00426 | 2016-06-16 18:39:34 +0000 | [diff] [blame] | 395 | // CHECK: define internal void [[SST_MICROTASK]](i32* {{[^,]+}}, i32* {{[^,]+}}, [[SST_TY]]* {{.+}}, i64 {{.+}}) |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 396 | // CHECK: [[RES:%.+]] = call i32 @__kmpc_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
| 397 | // CHECK-NEXT: icmp ne i32 [[RES]], 0 |
| 398 | // CHECK-NEXT: br i1 |
| 399 | |
| 400 | // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 |
| 401 | // CHECK-NEXT: load double*, double** % |
| 402 | // CHECK-NEXT: store double* % |
| 403 | // CHECK-LABEL: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv( |
| 404 | |
Alexey Bataev | 14fa1c6 | 2016-03-29 05:34:15 +0000 | [diff] [blame] | 405 | // CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
| 406 | // CHECK-NEXT: store i32 1, i32* [[DID_IT]], |
Alexey Bataev | e122da1 | 2016-03-17 10:50:17 +0000 | [diff] [blame] | 407 | // CHECK-NEXT: br label |
| 408 | |
| 409 | // CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}) |
| 410 | // CHECK-NEXT: br label |
| 411 | |
| 412 | // CHECK: getelementptr inbounds [1 x i8*], [1 x i8*]* [[LIST:%.+]], i64 0, i64 0 |
| 413 | // CHECK: load double*, double** % |
| 414 | // CHECK-NEXT: bitcast double* % |
| 415 | // CHECK-NEXT: store i8* % |
| 416 | // CHECK-NEXT: bitcast [1 x i8*]* [[LIST]] to i8* |
| 417 | // CHECK-NEXT: load i32, i32* [[DID_IT]], |
| 418 | // CHECK-NEXT: call void @__kmpc_copyprivate([[IDENT_T_TY]]* @{{.+}}, i32 %{{.+}}, i64 8, i8* %{{.+}}, void (i8*, i8*)* [[COPY_FUNC:@[^,]+]], i32 %{{.+}}) |
| 419 | // CHECK-NEXT: ret void |
| 420 | |
| 421 | // CHECK-LABEL: @_ZZN3SSTIdEC1EvENKUlvE_clEv( |
| 422 | // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 |
| 423 | // CHECK-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 |
| 424 | // CHECK-NEXT: load double*, double** % |
| 425 | // CHECK-NEXT: store double* % |
| 426 | // CHECK-LABEL: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( |
| 427 | // CHECK-NEXT: ret void |
| 428 | |
| 429 | // CHECK: define internal void [[COPY_FUNC]](i8*, i8*) |
| 430 | // CHECK: ret void |
| 431 | |
| 432 | // CHECK-LABEL: @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv( |