Clang Project

clang_source_code/test/OpenMP/nvptx_target_parallel_proc_bind_codegen.cpp
1// Test target codegen - host bc file has to be created first.
2// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
3// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
4// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
5// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
6// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
7// expected-no-diagnostics
8#ifndef HEADER
9#define HEADER
10
11// Check that the execution mode of all 3 target regions on the gpu is set to SPMD Mode.
12// CHECK-DAG: {{@__omp_offloading_.+l22}}_exec_mode = weak constant i8 0
13// CHECK-DAG: {{@__omp_offloading_.+l26}}_exec_mode = weak constant i8 0
14// CHECK-DAG: {{@__omp_offloading_.+l31}}_exec_mode = weak constant i8 0
15
16template<typename tx>
17tx ftemplate(int n) {
18  tx a = 0;
19  short aa = 0;
20  tx b[10];
21
22  #pragma omp target parallel proc_bind(master)
23  {
24  }
25
26  #pragma omp target parallel proc_bind(spread)
27  {
28    aa += 1;
29  }
30
31  #pragma omp target parallel proc_bind(close)
32  {
33    a += 1;
34    aa += 1;
35    b[2] += 1;
36  }
37
38  return a;
39}
40
41int bar(int n){
42  int a = 0;
43
44  a += ftemplate<int>(n);
45
46  return a;
47}
48
49  // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l22}}(
50  // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 0)
51  // CHECK: call void @__kmpc_data_sharing_init_stack_spmd
52  // CHECK: br label {{%?}}[[EXEC:.+]]
53  //
54  // CHECK: [[EXEC]]
55  // CHECK-NOT: call void @__kmpc_push_proc_bind
56  // CHECK: {{call|invoke}} void [[OP1:@.+]](
57  // CHECK: br label {{%?}}[[DONE:.+]]
58  //
59  // CHECK: [[DONE]]
60  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
61  // CHECK: br label {{%?}}[[EXIT:.+]]
62  //
63  // CHECK: [[EXIT]]
64  // CHECK: ret void
65  // CHECK: }
66
67
68
69
70
71  // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l26}}(
72  // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 0)
73  // CHECK: call void @__kmpc_data_sharing_init_stack_spmd
74  // CHECK: br label {{%?}}[[EXEC:.+]]
75  //
76  // CHECK: [[EXEC]]
77  // CHECK-NOT: call void @__kmpc_push_proc_bind
78  // CHECK: {{call|invoke}} void [[OP1:@.+]](
79  // CHECK: br label {{%?}}[[DONE:.+]]
80  //
81  // CHECK: [[DONE]]
82  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
83  // CHECK: br label {{%?}}[[EXIT:.+]]
84  //
85  // CHECK: [[EXIT]]
86  // CHECK: ret void
87  // CHECK: }
88
89
90
91
92  // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l31}}(
93  // CHECK: call void @__kmpc_spmd_kernel_init(i32 {{.+}}, i16 1, i16 0)
94  // CHECK: call void @__kmpc_data_sharing_init_stack_spmd
95  // CHECK: br label {{%?}}[[EXEC:.+]]
96  //
97  // CHECK: [[EXEC]]
98  // CHECK-NOT: call void @__kmpc_push_proc_bind
99  // CHECK: {{call|invoke}} void [[OP1:@.+]](
100  // CHECK: br label {{%?}}[[DONE:.+]]
101  //
102  // CHECK: [[DONE]]
103  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
104  // CHECK: br label {{%?}}[[EXIT:.+]]
105  //
106  // CHECK: [[EXIT]]
107  // CHECK: ret void
108  // CHECK: }
109#endif
110