cancellation_point_codegen.cpp revision 87d948ecccffea9e9e37d0d053b246e2d6d6c47b
1// RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s 2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 3// 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// REQUIRES: x86-registered-target 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#pragma omp cancel parallel 15 argv[0][0] = argc; 16} 17// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 18#pragma omp sections 19{ 20 { 21#pragma omp cancellation point sections 22#pragma omp cancel sections 23 } 24} 25// CHECK: call i32 @__kmpc_single( 26// CHECK-NOT: @__kmpc_cancellationpoint 27// CHECK: call void @__kmpc_end_single( 28// CHECK: call void @__kmpc_barrier(%ident_t* 29#pragma omp sections 30{ 31#pragma omp cancellation point sections 32#pragma omp section 33 { 34#pragma omp cancellation point sections 35#pragma omp cancel sections 36 } 37} 38// CHECK: call void @__kmpc_for_static_init_4( 39// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 40// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 41// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 42// CHECK: [[EXIT]] 43// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 44// CHECK: br label 45// CHECK: [[CONTINUE]] 46// CHECK: br label 47// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 48// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 49// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 50// CHECK: [[EXIT]] 51// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 52// CHECK: br label 53// CHECK: [[CONTINUE]] 54// CHECK: br label 55// CHECK: call void @__kmpc_for_static_fini( 56#pragma omp for 57for (int i = 0; i < argc; ++i) { 58#pragma omp cancellation point for 59#pragma omp cancel for 60} 61// CHECK: call void @__kmpc_for_static_init_4( 62// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2) 63// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 64// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 65// CHECK: [[EXIT]] 66// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 67// CHECK: br label 68// CHECK: [[CONTINUE]] 69// CHECK: br label 70// CHECK: call void @__kmpc_for_static_fini( 71// CHECK: call void @__kmpc_barrier(%ident_t* 72#pragma omp task 73{ 74#pragma omp cancellation point taskgroup 75#pragma omp cancel taskgroup 76} 77// CHECK: call i8* @__kmpc_omp_task_alloc( 78// CHECK: call i32 @__kmpc_omp_task( 79#pragma omp parallel sections 80{ 81 { 82#pragma omp cancellation point sections 83#pragma omp cancel sections 84 } 85} 86// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 87#pragma omp parallel sections 88{ 89 { 90#pragma omp cancellation point sections 91#pragma omp cancel sections 92 } 93#pragma omp section 94 { 95#pragma omp cancellation point sections 96 } 97} 98// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 99#pragma omp parallel for 100for (int i = 0; i < argc; ++i) { 101#pragma omp cancellation point for 102#pragma omp cancel for 103} 104// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 105 return argc; 106} 107 108// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}, 109// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1) 110// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 111// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 112// CHECK: [[EXIT]] 113// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 114// CHECK: br label %[[RETURN:.+]] 115// CHECK: [[RETURN]] 116// CHECK: ret void 117 118// CHECK: define internal i32 @{{[^(]+}}(i32 119// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4) 120// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 121// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 122// CHECK: [[EXIT]] 123// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 124// CHECK: br label %[[RETURN:.+]] 125// CHECK: [[RETURN]] 126// CHECK: ret i32 0 127 128// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) 129// CHECK: call i32 @__kmpc_single( 130// CHECK-NOT: @__kmpc_cancellationpoint 131// CHECK: call void @__kmpc_end_single( 132// CHECK: ret void 133 134// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) 135// CHECK: call void @__kmpc_for_static_init_4( 136// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3) 137// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 138// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 139// CHECK: [[EXIT]] 140// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 141// CHECK: br label 142// CHECK: [[CONTINUE]] 143// CHECK: br label 144// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 145// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 146// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 147// CHECK: [[EXIT]] 148// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 149// CHECK: br label 150// CHECK: [[CONTINUE]] 151// CHECK: br label 152// CHECK: call void @__kmpc_for_static_fini( 153// CHECK: ret void 154 155// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}, 156// CHECK: call void @__kmpc_for_static_init_4( 157// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2) 158// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 159// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 160// CHECK: [[EXIT]] 161// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 162// CHECK: br label 163// CHECK: [[CONTINUE]] 164// CHECK: br label 165// CHECK: call void @__kmpc_for_static_fini( 166// CHECK: ret void 167 168#endif 169