blob: 589aec8ea00dad6ae78c23f92870b0d041434d3e [file] [log] [blame]
Alexey Bataev0f34da12015-07-02 04:17:07 +00001// RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
Alexey Bataevbb045d42015-07-02 04:36:13 +00002// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
Alexey Bataev0f34da12015-07-02 04:17:07 +00003// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s
4// expected-no-diagnostics
5
6#ifndef HEADER
7#define HEADER
8
9int main (int argc, char **argv) {
10// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
11#pragma omp parallel
12{
13#pragma omp cancellation point parallel
14 argv[0][0] = argc;
15}
16// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
17#pragma omp sections
18{
19#pragma omp cancellation point sections
20}
21// CHECK: call i32 @__kmpc_single(
22// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
23// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
24// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
25// CHECK: [[EXIT]]
26// CHECK: br label
27// CHECK: [[CONTINUE]]
28// CHECK: br label
29// CHECK: call void @__kmpc_end_single(
30#pragma omp for
31for (int i = 0; i < argc; ++i) {
32#pragma omp cancellation point for
33}
34// CHECK: call void @__kmpc_for_static_init_4(
35// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
36// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
37// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
38// CHECK: [[EXIT]]
39// CHECK: br label
40// CHECK: [[CONTINUE]]
41// CHECK: br label
42// CHECK: call void @__kmpc_for_static_fini(
43#pragma omp task
44{
45#pragma omp cancellation point taskgroup
46}
47// CHECK: call i8* @__kmpc_omp_task_alloc(
48// CHECK: call i32 @__kmpc_omp_task(
49 return argc;
50}
51
52// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
53// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
54// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
55// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
56// CHECK: [[EXIT]]
57// CHECK: br label %[[RETURN:.+]]
58// CHECK: [[RETURN]]
59// CHECK: ret void
60
61// CHECK: define internal i32 @{{[^(]+}}(i32
62// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
63// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
64// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
65// CHECK: [[EXIT]]
66// CHECK: br label %[[RETURN:.+]]
67// CHECK: [[RETURN]]
68// CHECK: ret i32 0
69
70#endif