Alexey Bataev | db39021 | 2015-05-20 04:24:19 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -x c++ -emit-llvm %s -o - | FileCheck %s |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -x c++ -emit-llvm -std=c++98 %s -o - | FileCheck %s |
| 3 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -x c++ -emit-llvm -std=c++11 %s -o - | FileCheck %s |
Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4 | // 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_DEBUG |
Alexey Bataev | a8a9153a | 2017-12-29 18:07:07 +0000 | [diff] [blame] | 5 | |
| 6 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s |
| 7 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -x c++ -emit-llvm -std=c++98 %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s |
| 8 | // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fexceptions -fcxx-exceptions -x c++ -emit-llvm -std=c++11 %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s |
| 9 | // 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 %s |
| 10 | // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 11 | // expected-no-diagnostics |
| 12 | |
| 13 | int a; |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 14 | int b; |
| 15 | |
| 16 | struct St { |
Alexey Bataev | 5a19547 | 2015-09-04 12:55:50 +0000 | [diff] [blame] | 17 | unsigned long field; |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 18 | St() {} |
| 19 | ~St() {} |
| 20 | int &get() { return a; } |
| 21 | }; |
| 22 | |
| 23 | // CHECK-LABEL: parallel_atomic_ewc |
| 24 | void parallel_atomic_ewc() { |
Alexey Bataev | 5a19547 | 2015-09-04 12:55:50 +0000 | [diff] [blame] | 25 | St s; |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 26 | #pragma omp parallel |
| 27 | { |
Sean Fertile | d900dd0 | 2018-10-15 15:43:00 +0000 | [diff] [blame] | 28 | // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 29 | // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) |
| 30 | // CHECK: [[SCALAR_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic |
| 31 | // CHECK: store i32 [[SCALAR_VAL]], i32* @b |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 32 | // CHECK98: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) |
| 33 | // CHECK11: call void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 34 | #pragma omp atomic read |
| 35 | b = St().get(); |
Sean Fertile | d900dd0 | 2018-10-15 15:43:00 +0000 | [diff] [blame] | 36 | // CHECK-DAG: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) |
Alexey Bataev | 112a7bf | 2015-04-23 07:56:25 +0000 | [diff] [blame] | 37 | // CHECK-DAG: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) |
| 38 | // CHECK-DAG: [[B_VAL:%.+]] = load i32, i32* @b |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 39 | // CHECK: store atomic i32 [[B_VAL]], i32* [[SCALAR_ADDR]] monotonic |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 40 | // CHECK: {{invoke|call}} void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 41 | #pragma omp atomic write |
| 42 | St().get() = b; |
Sean Fertile | d900dd0 | 2018-10-15 15:43:00 +0000 | [diff] [blame] | 43 | // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) |
Alexey Bataev | b4505a7 | 2015-03-30 05:20:59 +0000 | [diff] [blame] | 44 | // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) |
| 45 | // CHECK: [[B_VAL:%.+]] = load i32, i32* @b |
| 46 | // CHECK: [[OLD_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic, |
| 47 | // CHECK: br label %[[OMP_UPDATE:.+]] |
| 48 | // CHECK: [[OMP_UPDATE]] |
| 49 | // CHECK: [[OLD_PHI_VAL:%.+]] = phi i32 [ [[OLD_VAL]], %{{.+}} ], [ [[NEW_OLD_VAL:%.+]], %[[OMP_UPDATE]] ] |
| 50 | // CHECK: [[NEW_VAL:%.+]] = srem i32 [[OLD_PHI_VAL]], [[B_VAL]] |
Alexey Bataev | f0ab553 | 2015-05-15 08:36:34 +0000 | [diff] [blame] | 51 | // CHECK: store i32 [[NEW_VAL]], i32* [[TEMP:%.+]], |
| 52 | // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP]], |
Alexey Bataev | b4505a7 | 2015-03-30 05:20:59 +0000 | [diff] [blame] | 53 | // CHECK: [[RES:%.+]] = cmpxchg i32* [[SCALAR_ADDR]], i32 [[OLD_PHI_VAL]], i32 [[NEW_VAL]] monotonic monotonic |
| 54 | // CHECK: [[NEW_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0 |
| 55 | // CHECK: [[COND:%.+]] = extractvalue { i32, i1 } [[RES]], 1 |
| 56 | // CHECK: br i1 [[COND]], label %[[OMP_DONE:.+]], label %[[OMP_UPDATE]] |
| 57 | // CHECK: [[OMP_DONE]] |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 58 | // CHECK: {{invoke|call}} void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) |
Alexey Bataev | b4505a7 | 2015-03-30 05:20:59 +0000 | [diff] [blame] | 59 | #pragma omp atomic |
| 60 | St().get() %= b; |
Alexey Bataev | 5a19547 | 2015-09-04 12:55:50 +0000 | [diff] [blame] | 61 | #pragma omp atomic |
| 62 | s.field++; |
Sean Fertile | d900dd0 | 2018-10-15 15:43:00 +0000 | [diff] [blame] | 63 | // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) |
Alexey Bataev | 5e018f9 | 2015-04-23 06:35:10 +0000 | [diff] [blame] | 64 | // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) |
| 65 | // CHECK: [[B_VAL:%.+]] = load i32, i32* @b |
| 66 | // CHECK: [[OLD_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic, |
| 67 | // CHECK: br label %[[OMP_UPDATE:.+]] |
| 68 | // CHECK: [[OMP_UPDATE]] |
| 69 | // CHECK: [[OLD_PHI_VAL:%.+]] = phi i32 [ [[OLD_VAL]], %{{.+}} ], [ [[NEW_OLD_VAL:%.+]], %[[OMP_UPDATE]] ] |
Alexey Bataev | f0ab553 | 2015-05-15 08:36:34 +0000 | [diff] [blame] | 70 | // CHECK: [[NEW_CALC_VAL:%.+]] = srem i32 [[OLD_PHI_VAL]], [[B_VAL]] |
| 71 | // CHECK: store i32 [[NEW_CALC_VAL]], i32* [[TEMP:%.+]], |
| 72 | // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP]], |
Alexey Bataev | 5e018f9 | 2015-04-23 06:35:10 +0000 | [diff] [blame] | 73 | // CHECK: [[RES:%.+]] = cmpxchg i32* [[SCALAR_ADDR]], i32 [[OLD_PHI_VAL]], i32 [[NEW_VAL]] monotonic monotonic |
| 74 | // CHECK: [[NEW_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0 |
| 75 | // CHECK: [[COND:%.+]] = extractvalue { i32, i1 } [[RES]], 1 |
| 76 | // CHECK: br i1 [[COND]], label %[[OMP_DONE:.+]], label %[[OMP_UPDATE]] |
| 77 | // CHECK: [[OMP_DONE]] |
Alexey Bataev | f0ab553 | 2015-05-15 08:36:34 +0000 | [diff] [blame] | 78 | // CHECK: store i32 [[NEW_CALC_VAL]], i32* @a, |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 79 | // CHECK: {{invoke|call}} void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) |
Alexey Bataev | 5e018f9 | 2015-04-23 06:35:10 +0000 | [diff] [blame] | 80 | #pragma omp atomic capture |
| 81 | a = St().get() %= b; |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 82 | } |
| 83 | } |
| 84 | |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 85 | int &foo() { return a; } |
| 86 | |
| 87 | // TERM_DEBUG-LABEL: parallel_atomic |
| 88 | void parallel_atomic() { |
| 89 | #pragma omp parallel |
| 90 | { |
| 91 | #pragma omp atomic read |
| 92 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 93 | // TERM_DEBUG: invoke {{.*}}foo{{.*}}() |
| 94 | // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], |
Alexey Bataev | 10fec57 | 2015-03-11 04:48:56 +0000 | [diff] [blame] | 95 | // TERM_DEBUG: load atomic i32, i32* @{{.+}} monotonic, {{.*}}!dbg [[READ_LOC:![0-9]+]] |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 96 | foo() = a; |
| 97 | #pragma omp atomic write |
| 98 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 99 | // TERM_DEBUG: invoke {{.*}}foo{{.*}}() |
| 100 | // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], |
| 101 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 102 | // TERM_DEBUG: store atomic i32 {{%.+}}, i32* @{{.+}} monotonic, {{.*}}!dbg [[WRITE_LOC:![0-9]+]] |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 103 | a = foo(); |
Alexey Bataev | b4505a7 | 2015-03-30 05:20:59 +0000 | [diff] [blame] | 104 | #pragma omp atomic update |
| 105 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 106 | // TERM_DEBUG: invoke {{.*}}foo{{.*}}() |
| 107 | // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], |
| 108 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 109 | // TERM_DEBUG: atomicrmw add i32* @{{.+}}, i32 %{{.+}} monotonic, {{.*}}!dbg [[UPDATE_LOC:![0-9]+]] |
| 110 | a += foo(); |
Alexey Bataev | 5e018f9 | 2015-04-23 06:35:10 +0000 | [diff] [blame] | 111 | #pragma omp atomic capture |
| 112 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 113 | // TERM_DEBUG: invoke {{.*}}foo{{.*}}() |
| 114 | // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], |
| 115 | // TERM_DEBUG-NOT: __kmpc_global_thread_num |
| 116 | // TERM_DEBUG: [[OLD_VAL:%.+]] = atomicrmw add i32* @{{.+}}, i32 %{{.+}} monotonic, {{.*}}!dbg [[CAPTURE_LOC:![0-9]+]] |
| 117 | // TERM_DEBUG: store i32 [[OLD_VAL]], i32* @b, |
| 118 | {b = a; a += foo(); } |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 119 | } |
Alexey Bataev | b4505a7 | 2015-03-30 05:20:59 +0000 | [diff] [blame] | 120 | // TERM_DEBUG: [[TERM_LPAD]] |
| 121 | // TERM_DEBUG: call void @__clang_call_terminate |
| 122 | // TERM_DEBUG: unreachable |
Alexey Bataev | 36bf011 | 2015-03-10 05:15:26 +0000 | [diff] [blame] | 123 | } |
Alexey Bataev | 33c5640 | 2015-12-14 09:26:19 +0000 | [diff] [blame] | 124 | // TERM_DEBUG-DAG: [[READ_LOC]] = !DILocation(line: [[@LINE-28]], |
| 125 | // TERM_DEBUG-DAG: [[WRITE_LOC]] = !DILocation(line: [[@LINE-22]], |
| 126 | // TERM_DEBUG-DAG: [[UPDATE_LOC]] = !DILocation(line: [[@LINE-16]], |
| 127 | // TERM_DEBUG-DAG: [[CAPTURE_LOC]] = !DILocation(line: [[@LINE-9]], |