blob: e78720db6667b8c9ea737882968c919f196dd30b [file] [log] [blame]
Alexey Bataev10fec572015-03-11 04:48:56 +00001// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -x c++ -emit-llvm %s -o - | FileCheck %s
Alexey Bataev36bf0112015-03-10 05:15:26 +00002// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
3// expected-no-diagnostics
4
5int a;
Alexey Bataev10fec572015-03-11 04:48:56 +00006int b;
7
8struct St {
9 St() {}
10 ~St() {}
11 int &get() { return a; }
12};
13
14// CHECK-LABEL: parallel_atomic_ewc
15void parallel_atomic_ewc() {
16#pragma omp parallel
17 {
18 // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]])
19 // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]])
20 // CHECK: [[SCALAR_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic
21 // CHECK: store i32 [[SCALAR_VAL]], i32* @b
22 // CHECK: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]])
23#pragma omp atomic read
24 b = St().get();
25 // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]])
26 // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]])
27 // CHECK: [[B_VAL:%.+]] = load i32, i32* @b
28 // CHECK: store atomic i32 [[B_VAL]], i32* [[SCALAR_ADDR]] monotonic
29 // CHECK: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]])
30#pragma omp atomic write
31 St().get() = b;
32 }
33}
34
Alexey Bataev36bf0112015-03-10 05:15:26 +000035int &foo() { return a; }
36
37// TERM_DEBUG-LABEL: parallel_atomic
38void parallel_atomic() {
39#pragma omp parallel
40 {
41#pragma omp atomic read
42 // TERM_DEBUG-NOT: __kmpc_global_thread_num
43 // TERM_DEBUG: invoke {{.*}}foo{{.*}}()
44 // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
Alexey Bataev10fec572015-03-11 04:48:56 +000045 // TERM_DEBUG: load atomic i32, i32* @{{.+}} monotonic, {{.*}}!dbg [[READ_LOC:![0-9]+]]
Alexey Bataev36bf0112015-03-10 05:15:26 +000046 foo() = a;
47#pragma omp atomic write
48 // TERM_DEBUG-NOT: __kmpc_global_thread_num
49 // TERM_DEBUG: invoke {{.*}}foo{{.*}}()
50 // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
51 // TERM_DEBUG-NOT: __kmpc_global_thread_num
52 // TERM_DEBUG: store atomic i32 {{%.+}}, i32* @{{.+}} monotonic, {{.*}}!dbg [[WRITE_LOC:![0-9]+]]
Alexey Bataevda19af42015-03-10 05:28:46 +000053 // TERM_DEBUG: [[TERM_LPAD]]
Alexey Bataev36bf0112015-03-10 05:15:26 +000054 // TERM_DEBUG: call void @__clang_call_terminate
55 // TERM_DEBUG: unreachable
56 a = foo();
57 }
58}
Alexey Bataev10fec572015-03-11 04:48:56 +000059// TERM_DEBUG-DAG: [[READ_LOC]] = !MDLocation(line: 41,
60// TERM_DEBUG-DAG: [[WRITE_LOC]] = !MDLocation(line: 47,