blob: e78720db6667b8c9ea737882968c919f196dd30b [file] [log] [blame]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -x c++ -emit-llvm %s -o - | FileCheck %s
2// 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;
6int 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
35int &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:.+]],
45 // TERM_DEBUG: load atomic i32, i32* @{{.+}} monotonic, {{.*}}!dbg [[READ_LOC:![0-9]+]]
46 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]+]]
53 // TERM_DEBUG: [[TERM_LPAD]]
54 // TERM_DEBUG: call void @__clang_call_terminate
55 // TERM_DEBUG: unreachable
56 a = foo();
57 }
58}
59// TERM_DEBUG-DAG: [[READ_LOC]] = !MDLocation(line: 41,
60// TERM_DEBUG-DAG: [[WRITE_LOC]] = !MDLocation(line: 47,