13ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -x c++ -emit-llvm %s -o - | FileCheck %s 23ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// 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 33ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// expected-no-diagnostics 43ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 53ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarint a; 63ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarint b; 73ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 83ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarstruct St { 93ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar St() {} 103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ~St() {} 113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar int &get() { return a; } 123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}; 133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-LABEL: parallel_atomic_ewc 153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid parallel_atomic_ewc() { 163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp parallel 173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar { 183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) 193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) 203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[SCALAR_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic 213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32 [[SCALAR_VAL]], i32* @b 223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) 233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp atomic read 243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar b = St().get(); 253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) 263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) 273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[B_VAL:%.+]] = load i32, i32* @b 283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store atomic i32 [[B_VAL]], i32* [[SCALAR_ADDR]] monotonic 293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) 303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp atomic write 313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar St().get() = b; 3233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StC1Ev(%struct.St* [[TEMP_ST_ADDR:%.+]]) 3333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[SCALAR_ADDR:%.+]] = invoke dereferenceable(4) i32* @_ZN2St3getEv(%struct.St* [[TEMP_ST_ADDR]]) 3433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[B_VAL:%.+]] = load i32, i32* @b 3533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[OLD_VAL:%.+]] = load atomic i32, i32* [[SCALAR_ADDR]] monotonic, 3633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: br label %[[OMP_UPDATE:.+]] 3733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[OMP_UPDATE]] 3833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[OLD_PHI_VAL:%.+]] = phi i32 [ [[OLD_VAL]], %{{.+}} ], [ [[NEW_OLD_VAL:%.+]], %[[OMP_UPDATE]] ] 3933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[NEW_VAL:%.+]] = srem i32 [[OLD_PHI_VAL]], [[B_VAL]] 4033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[RES:%.+]] = cmpxchg i32* [[SCALAR_ADDR]], i32 [[OLD_PHI_VAL]], i32 [[NEW_VAL]] monotonic monotonic 4133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[NEW_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0 4233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[COND:%.+]] = extractvalue { i32, i1 } [[RES]], 1 4333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: br i1 [[COND]], label %[[OMP_DONE:.+]], label %[[OMP_UPDATE]] 4433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: [[OMP_DONE]] 4533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // CHECK: invoke void @_ZN2StD1Ev(%struct.St* [[TEMP_ST_ADDR]]) 4633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#pragma omp atomic 4733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar St().get() %= b; 483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarint &foo() { return a; } 523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// TERM_DEBUG-LABEL: parallel_atomic 543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid parallel_atomic() { 553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp parallel 563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar { 573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp atomic read 583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG-NOT: __kmpc_global_thread_num 593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: invoke {{.*}}foo{{.*}}() 603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], 613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: load atomic i32, i32* @{{.+}} monotonic, {{.*}}!dbg [[READ_LOC:![0-9]+]] 623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar foo() = a; 633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#pragma omp atomic write 643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG-NOT: __kmpc_global_thread_num 653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: invoke {{.*}}foo{{.*}}() 663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], 673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG-NOT: __kmpc_global_thread_num 683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // TERM_DEBUG: store atomic i32 {{%.+}}, i32* @{{.+}} monotonic, {{.*}}!dbg [[WRITE_LOC:![0-9]+]] 693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar a = foo(); 7033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#pragma omp atomic update 7133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG-NOT: __kmpc_global_thread_num 7233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: invoke {{.*}}foo{{.*}}() 7333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], 7433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG-NOT: __kmpc_global_thread_num 7533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: atomicrmw add i32* @{{.+}}, i32 %{{.+}} monotonic, {{.*}}!dbg [[UPDATE_LOC:![0-9]+]] 7633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar a += foo(); 773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 7833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: [[TERM_LPAD]] 7933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: call void @__clang_call_terminate 8033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // TERM_DEBUG: unreachable 813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 8233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// TERM_DEBUG-DAG: [[READ_LOC]] = !MDLocation(line: [[@LINE-25]], 8333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// TERM_DEBUG-DAG: [[WRITE_LOC]] = !MDLocation(line: [[@LINE-20]], 8433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// TERM_DEBUG-DAG: [[UPDATE_LOC]] = !MDLocation(line: [[@LINE-14]], 85