1 // RUN: %clang_cc1 -std=c++11 -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s 2 3 // RUN: %clang_cc1 -std=c++11 -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 4 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 5 6 //CHECK: call i32 @__kmpc_cancel 7 //CHECK: br {{.*}}label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 8 //CHECK: [[EXIT]]: 9 //CHECK: store i32 [[EXIT_SLOT:[0-9]+]] 10 //CHECK: br label %[[CLEANUP:.+]] 11 //CHECK: [[CONTINUE]]: 12 //CHECK: store i32 [[CONT_SLOT:[0-9]+]], 13 //CHECK: br label %[[CLEANUP]] 14 //CHECK: [[CLEANUP]]: 15 //CHECK-NEXT: call void @_ZN3ObjD1Ev 16 //CHECK: switch i32{{.*}}, label %[[UNREACHABLE:.+]] [ 17 //CHECK: i32 [[CONT_SLOT]], label %[[CLEANUPCONT:.+]] 18 //CHECK: i32 [[EXIT_SLOT]], label %[[CANCELEXIT:.+]] 19 //CHECK-NEXT: ] 20 //CHECK: [[CLEANUPCONT]]: 21 //CHECK: br label %[[CANCELCONT:.+]] 22 //CHECK: [[CANCELCONT]]: 23 //CHECK-NEXT: call void @__kmpc_barrier( 24 //CHECK-NEXT: ret void 25 //CHECK: [[UNREACHABLE]]: 26 //CHECK-NEXT: unreachable 27 //CHECK-NEXT: } 28 29 struct Obj { 30 int a; Obj(); Obj(const Obj& r) = delete; Obj &operator=(const Obj& r); 31 ~Obj(); 32 }; 33 34 void foo() { 35 int i,count = 0; 36 Obj obj; 37 38 #pragma omp parallel private(i) num_threads(1) 39 { 40 #pragma omp for reduction(+:count) lastprivate(obj) 41 for (i=0; i<1000; i++) { 42 if(i==100) { 43 obj.a = 100; 44 #pragma omp cancel for 45 } 46 count++; 47 } 48 } 49 } 50