xref: /llvm-project/clang/test/OpenMP/cancel_codegen_cleanup.cpp (revision 0026ed2f9cc73e60bbfb1d84b8906a8d4ffb8e96)
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 //CHECK: call i32 @__kmpc_cancel
4 //CHECK: br {{.*}}label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
5 //CHECK: [[EXIT]]:
6 //CHECK: store i32 [[EXIT_SLOT:[0-9]+]]
7 //CHECK: br label %[[CLEANUP:.+]]
8 //CHECK: [[CONTINUE]]:
9 //CHECK: store i32 [[CONT_SLOT:[0-9]+]],
10 //CHECK: br label %[[CLEANUP]]
11 //CHECK: [[CLEANUP]]:
12 //CHECK-NEXT: call void @_ZN3ObjD1Ev
13 //CHECK: switch i32{{.*}}, label %[[UNREACHABLE:.+]] [
14 //CHECK:   i32 [[CONT_SLOT]], label %[[CLEANUPCONT:.+]]
15 //CHECK:   i32 [[EXIT_SLOT]], label %[[CANCELEXIT:.+]]
16 //CHECK-NEXT: ]
17 //CHECK: [[CLEANUPCONT]]:
18 //CHECK: br label %[[CANCELCONT:.+]]
19 //CHECK: [[CANCELCONT]]:
20 //CHECK-NEXT: call void @__kmpc_barrier(
21 //CHECK-NEXT: ret void
22 //CHECK: [[UNREACHABLE]]:
23 //CHECK-NEXT: unreachable
24 //CHECK-NEXT: }
25 
26 struct Obj {
27   int a; Obj(); Obj(const Obj& r) = delete; Obj &operator=(const Obj& r);
28   ~Obj();
29 };
30 
31 void foo() {
32   int i,count = 0;
33   Obj obj;
34 
35   #pragma omp parallel private(i) num_threads(1)
36   {
37       #pragma omp for reduction(+:count) lastprivate(obj)
38       for (i=0; i<1000; i++) {
39             if(i==100) {
40                 obj.a = 100;
41                 #pragma omp cancel for
42             }
43             count++;
44         }
45     }
46 }
47