Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 1 | // 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 | |
| 5 | int a; |
| 6 | int b; |
| 7 | |
| 8 | struct St { |
| 9 | St() {} |
| 10 | ~St() {} |
| 11 | int &get() { return a; } |
| 12 | }; |
| 13 | |
| 14 | // CHECK-LABEL: parallel_atomic_ewc |
| 15 | void 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 | |
| 35 | int &foo() { return a; } |
| 36 | |
| 37 | // TERM_DEBUG-LABEL: parallel_atomic |
| 38 | void 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, |