1 // Test host codegen.
2 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64 --check-prefix OMP45
3 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
4 // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64  --check-prefix HCHECK --check-prefix OMP45
5 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32  --check-prefix HCHECK --check-prefix OMP45
6 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32 --check-prefix HCHECK --check-prefix OMP45
8 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64 --check-prefix OMP50
9 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -DOMP5
10 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64  --check-prefix HCHECK --check-prefix OMP50
11 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -DOMP5| FileCheck %s --check-prefix CHECK --check-prefix CHECK-32  --check-prefix HCHECK --check-prefix OMP50
12 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -DOMP5
13 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32 --check-prefix HCHECK --check-prefix OMP50
14 
15 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
16 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
17 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
18 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
19 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
20 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
21 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY0 %s
22 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -DOMP5
23 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY0 %s
24 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY0 %s
25 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -DOMP5
26 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY0 %s
27 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
28 
29 // Test target codegen - host bc file has to be created first. (no significant differences with host version of target region)
30 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
31 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
32 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
33 // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
34 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
35 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
36 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
37 // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
38 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -DOMP5
39 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix OMP50
40 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s -DOMP5
41 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix OMP50
42 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc -DOMP5
43 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix OMP50
44 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s -DOMP5
45 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck %s --check-prefix CHECK --check-prefix OMP50
46 
47 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
48 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
49 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
50 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
51 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
52 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
53 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
54 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
55 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -DOMP5
56 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY1 %s
57 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s -DOMP5
58 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY1 %s
59 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc -DOMP5
60 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY1 %s
61 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s -DOMP5
62 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - -DOMP5 | FileCheck --check-prefix SIMD-ONLY1 %s
63 // SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
64 
65 // expected-no-diagnostics
66 #ifndef HEADER
67 #define HEADER
68 
69 // CHECK-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* }
70 // CHECK-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
71 // CHECK-DAG: [[DEF_LOC_0:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) }
72 // CHECK-DAG: [[DEF_LOC_DISTRIBUTE_0:@.+]] = private unnamed_addr global %struct.ident_t { i32 0, i32 2050, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) }
73 
74 // CHECK-LABEL: define {{.*void}} @{{.*}}without_schedule_clause{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
75 void without_schedule_clause(float *a, float *b, float *c, float *d) {
76   #pragma omp target
77   #pragma omp teams
78 #ifdef OMP5
79   #pragma omp distribute simd simdlen(8) aligned(a) if(true)
80 #else
81   #pragma omp distribute simd simdlen(8) aligned(a)
82 #endif // OMP5
83   for (int i = 33; i < 32000000; i += 7) {
84     a[i] = b[i] * c[i] * d[i];
85   }
86 }
87 
88 // CHECK: define {{.*}}void @{{.+}}(i32* noalias [[GBL_TIDP:%.+]], i32* noalias [[BND_TID:%.+]], float** dereferenceable({{[0-9]+}}) [[APTR:%.+]], float** dereferenceable({{[0-9]+}}) [[BPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[CPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[DPTR:%.+]])
89 // CHECK:  [[TID_ADDR:%.+]] = alloca i32*
90 // CHECK:  [[IV:%.+iv]] = alloca i32
91 // CHECK:  [[LB:%.+lb]] = alloca i32
92 // CHECK:  [[UB:%.+ub]] = alloca i32
93 // CHECK:  [[ST:%.+stride]] = alloca i32
94 // CHECK:  [[LAST:%.+last]] = alloca i32
95 // CHECK-DAG:  store i32* [[GBL_TIDP]], i32** [[TID_ADDR]]
96 // CHECK-DAG:  call void @llvm.assume(
97 // CHECK-DAG:  store i32 0, i32* [[LB]]
98 // CHECK-DAG:  store i32 4571423, i32* [[UB]]
99 // CHECK-DAG:  store i32 1, i32* [[ST]]
100 // CHECK-DAG:  store i32 0, i32* [[LAST]]
101 // CHECK-DAG:  [[GBL_TID:%.+]] = load i32*, i32** [[TID_ADDR]]
102 // CHECK-DAG:  [[GBL_TIDV:%.+]] = load i32, i32* [[GBL_TID]]
103 // CHECK:  call void @__kmpc_for_static_init_{{.+}}(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]], i32 92, i32* %.omp.is_last, i32* %.omp.lb, i32* %.omp.ub, i32* %.omp.stride, i32 1, i32 1)
104 // CHECK-DAG:  [[UBV0:%.+]] = load i32, i32* [[UB]]
105 // CHECK-DAG:  [[USWITCH:%.+]] = icmp sgt i32 [[UBV0]], 4571423
106 // CHECK:  br i1 [[USWITCH]], label %[[BBCT:.+]], label %[[BBCF:.+]]
107 // CHECK-DAG:  [[BBCT]]:
108 // CHECK-DAG:  br label %[[BBCE:.+]]
109 // CHECK-DAG:  [[BBCF]]:
110 // CHECK-DAG:  [[UBV1:%.+]] = load i32, i32* [[UB]]
111 // CHECK-DAG:  br label %[[BBCE]]
112 // CHECK:  [[BBCE]]:
113 // CHECK:  [[SELUB:%.+]] = phi i32 [ 4571423, %[[BBCT]] ], [ [[UBV1]], %[[BBCF]] ]
114 // CHECK:  store i32 [[SELUB]], i32* [[UB]]
115 // CHECK:  [[LBV0:%.+]] = load i32, i32* [[LB]]
116 // CHECK:  store i32 [[LBV0]], i32* [[IV]]
117 // CHECK:  br label %[[BBINNFOR:.+]]
118 // CHECK:  [[BBINNFOR]]:
119 // CHECK:  [[IVVAL0:%.+]] = load i32, i32* [[IV]]
120 // CHECK:  [[UBV2:%.+]] = load i32, i32* [[UB]]
121 // CHECK:  [[IVLEUB:%.+]] = icmp sle i32 [[IVVAL0]], [[UBV2]]
122 // CHECK:  br i1 [[IVLEUB]], label %[[BBINNBODY:.+]], label %[[BBINNEND:.+]]
123 // CHECK:  [[BBINNBODY]]:
124 // CHECK:  {{.+}} = load i32, i32* [[IV]]
125 // ... loop body ...
126 // CHECK:  br label %[[BBBODYCONT:.+]]
127 // CHECK:  [[BBBODYCONT]]:
128 // CHECK:  br label %[[BBINNINC:.+]]
129 // CHECK:  [[BBINNINC]]:
130 // CHECK:  [[IVVAL1:%.+]] = load i32, i32* [[IV]]
131 // CHECK:  [[IVINC:%.+]] = add nsw i32 [[IVVAL1]], 1
132 // CHECK:  store i32 [[IVINC]], i32* [[IV]]
133 // CHECK:  br label %[[BBINNFOR]]
134 // CHECK:  [[BBINNEND]]:
135 // CHECK:  br label %[[LPEXIT:.+]]
136 // CHECK:  [[LPEXIT]]:
137 // CHECK:  call void @__kmpc_for_static_fini(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]])
138 // CHECK:  ret void
139 
140 
141 // CHECK-LABEL: define {{.*void}} @{{.*}}static_not_chunked{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
142 void static_not_chunked(float *a, float *b, float *c, float *d) {
143   #pragma omp target
144   #pragma omp teams
145 #ifdef OMP5
146   #pragma omp distribute simd dist_schedule(static) safelen(32) if(simd: true)
147 #else
148   #pragma omp distribute simd dist_schedule(static) safelen(32)
149 #endif // OMP5
150   for (int i = 32000000; i > 33; i += -7) {
151         a[i] = b[i] * c[i] * d[i];
152   }
153 }
154 
155 // CHECK: define {{.*}}void @.omp_outlined.{{.*}}(i32* noalias [[GBL_TIDP:%.+]], i32* noalias [[BND_TID:%.+]], float** dereferenceable({{[0-9]+}}) [[APTR:%.+]], float** dereferenceable({{[0-9]+}}) [[BPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[CPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[DPTR:%.+]])
156 // CHECK:  [[TID_ADDR:%.+]] = alloca i32*
157 // CHECK:  [[IV:%.+iv]] = alloca i32
158 // CHECK:  [[LB:%.+lb]] = alloca i32
159 // CHECK:  [[UB:%.+ub]] = alloca i32
160 // CHECK:  [[ST:%.+stride]] = alloca i32
161 // CHECK:  [[LAST:%.+last]] = alloca i32
162 // CHECK-DAG:  store i32* [[GBL_TIDP]], i32** [[TID_ADDR]]
163 // CHECK-DAG:  store i32 0, i32* [[LB]]
164 // CHECK-DAG:  store i32 4571423, i32* [[UB]]
165 // CHECK-DAG:  store i32 1, i32* [[ST]]
166 // CHECK-DAG:  store i32 0, i32* [[LAST]]
167 // CHECK-DAG:  [[GBL_TID:%.+]] = load i32*, i32** [[TID_ADDR]]
168 // CHECK-DAG:  [[GBL_TIDV:%.+]] = load i32, i32* [[GBL_TID]]
169 // CHECK:  call void @__kmpc_for_static_init_{{.+}}(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]], i32 92, i32* %.omp.is_last, i32* %.omp.lb, i32* %.omp.ub, i32* %.omp.stride, i32 1, i32 1)
170 // CHECK-DAG:  [[UBV0:%.+]] = load i32, i32* [[UB]]
171 // CHECK-DAG:  [[USWITCH:%.+]] = icmp sgt i32 [[UBV0]], 4571423
172 // CHECK:  br i1 [[USWITCH]], label %[[BBCT:.+]], label %[[BBCF:.+]]
173 // CHECK-DAG:  [[BBCT]]:
174 // CHECK-DAG:  br label %[[BBCE:.+]]
175 // CHECK-DAG:  [[BBCF]]:
176 // CHECK-DAG:  [[UBV1:%.+]] = load i32, i32* [[UB]]
177 // CHECK-DAG:  br label %[[BBCE]]
178 // CHECK:  [[BBCE]]:
179 // CHECK:  [[SELUB:%.+]] = phi i32 [ 4571423, %[[BBCT]] ], [ [[UBV1]], %[[BBCF]] ]
180 // CHECK:  store i32 [[SELUB]], i32* [[UB]]
181 // CHECK:  [[LBV0:%.+]] = load i32, i32* [[LB]]
182 // CHECK:  store i32 [[LBV0]], i32* [[IV]]
183 // CHECK:  br label %[[BBINNFOR:.+]]
184 // CHECK:  [[BBINNFOR]]:
185 // CHECK:  [[IVVAL0:%.+]] = load i32, i32* [[IV]]
186 // CHECK:  [[UBV2:%.+]] = load i32, i32* [[UB]]
187 // CHECK:  [[IVLEUB:%.+]] = icmp sle i32 [[IVVAL0]], [[UBV2]]
188 // CHECK:  br i1 [[IVLEUB]], label %[[BBINNBODY:.+]], label %[[BBINNEND:.+]]
189 // CHECK:  [[BBINNBODY]]:
190 // CHECK:  {{.+}} = load i32, i32* [[IV]]
191 // ... loop body ...
192 // CHECK:  br label %[[BBBODYCONT:.+]]
193 // CHECK:  [[BBBODYCONT]]:
194 // CHECK:  br label %[[BBINNINC:.+]]
195 // CHECK:  [[BBINNINC]]:
196 // CHECK:  [[IVVAL1:%.+]] = load i32, i32* [[IV]]
197 // CHECK:  [[IVINC:%.+]] = add nsw i32 [[IVVAL1]], 1
198 // CHECK:  store i32 [[IVINC]], i32* [[IV]]
199 // CHECK:  br label %[[BBINNFOR]]
200 // CHECK:  [[BBINNEND]]:
201 // CHECK:  br label %[[LPEXIT:.+]]
202 // CHECK:  [[LPEXIT]]:
203 // CHECK:  call void @__kmpc_for_static_fini(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]])
204 // CHECK:  ret void
205 
206 
207 // CHECK-LABEL: define {{.*void}} @{{.*}}static_chunked{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
208 void static_chunked(float *a, float *b, float *c, float *d) {
209   #pragma omp target
210   #pragma omp teams
211 #pragma omp distribute simd dist_schedule(static, 5)
212   for (unsigned i = 131071; i <= 2147483647; i += 127) {
213     a[i] = b[i] * c[i] * d[i];
214   }
215 }
216 
217 // CHECK: define {{.*}}void @.omp_outlined.{{.*}}(i32* noalias [[GBL_TIDP:%.+]], i32* noalias [[BND_TID:%.+]], float** dereferenceable({{[0-9]+}}) [[APTR:%.+]], float** dereferenceable({{[0-9]+}}) [[BPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[CPTR:%.+]], float** dereferenceable({{[0-9]+}}) [[DPTR:%.+]])
218 // CHECK:  [[TID_ADDR:%.+]] = alloca i32*
219 // CHECK:  [[IV:%.+iv]] = alloca i32
220 // CHECK:  [[LB:%.+lb]] = alloca i32
221 // CHECK:  [[UB:%.+ub]] = alloca i32
222 // CHECK:  [[ST:%.+stride]] = alloca i32
223 // CHECK:  [[LAST:%.+last]] = alloca i32
224 // CHECK-DAG:  store i32* [[GBL_TIDP]], i32** [[TID_ADDR]]
225 // CHECK-DAG:  store i32 0, i32* [[LB]]
226 // CHECK-DAG:  store i32 16908288, i32* [[UB]]
227 // CHECK-DAG:  store i32 1, i32* [[ST]]
228 // CHECK-DAG:  store i32 0, i32* [[LAST]]
229 // CHECK-DAG:  [[GBL_TID:%.+]] = load i32*, i32** [[TID_ADDR]]
230 // CHECK-DAG:  [[GBL_TIDV:%.+]] = load i32, i32* [[GBL_TID]]
231 // CHECK:  call void @__kmpc_for_static_init_{{.+}}(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]], i32 91, i32* %.omp.is_last, i32* %.omp.lb, i32* %.omp.ub, i32* %.omp.stride, i32 1, i32 5)
232 // CHECK-DAG:  [[UBV0:%.+]] = load i32, i32* [[UB]]
233 // CHECK-DAG:  [[USWITCH:%.+]] = icmp ugt i32 [[UBV0]], 16908288
234 // CHECK:  br i1 [[USWITCH]], label %[[BBCT:.+]], label %[[BBCF:.+]]
235 // CHECK-DAG:  [[BBCT]]:
236 // CHECK-DAG:  br label %[[BBCE:.+]]
237 // CHECK-DAG:  [[BBCF]]:
238 // CHECK-DAG:  [[UBV1:%.+]] = load i32, i32* [[UB]]
239 // CHECK-DAG:  br label %[[BBCE]]
240 // CHECK:  [[BBCE]]:
241 // CHECK:  [[SELUB:%.+]] = phi i32 [ 16908288, %[[BBCT]] ], [ [[UBV1]], %[[BBCF]] ]
242 // CHECK:  store i32 [[SELUB]], i32* [[UB]]
243 // CHECK:  [[LBV0:%.+]] = load i32, i32* [[LB]]
244 // CHECK:  store i32 [[LBV0]], i32* [[IV]]
245 // CHECK:  br label %[[BBINNFOR:.+]]
246 // CHECK:  [[BBINNFOR]]:
247 // CHECK:  [[IVVAL0:%.+]] = load i32, i32* [[IV]]
248 // CHECK:  [[UBV2:%.+]] = load i32, i32* [[UB]]
249 // CHECK:  [[IVLEUB:%.+]] = icmp ule i32 [[IVVAL0]], [[UBV2]]
250 // CHECK:  br i1 [[IVLEUB]], label %[[BBINNBODY:.+]], label %[[BBINNEND:.+]]
251 // CHECK:  [[BBINNBODY]]:
252 // CHECK:  {{.+}} = load i32, i32* [[IV]]
253 // ... loop body ...
254 // CHECK:  br label %[[BBBODYCONT:.+]]
255 // CHECK:  [[BBBODYCONT]]:
256 // CHECK:  br label %[[BBINNINC:.+]]
257 // CHECK:  [[BBINNINC]]:
258 // CHECK:  [[IVVAL1:%.+]] = load i32, i32* [[IV]]
259 // CHECK:  [[IVINC:%.+]] = add i32 [[IVVAL1]], 1
260 // CHECK:  store i32 [[IVINC]], i32* [[IV]]
261 // CHECK:  br label %[[BBINNFOR]]
262 // CHECK:  [[BBINNEND]]:
263 // CHECK:  br label %[[LPEXIT:.+]]
264 // CHECK:  [[LPEXIT]]:
265 // CHECK:  call void @__kmpc_for_static_fini(%struct.ident_t* [[DEF_LOC_DISTRIBUTE_0]], i32 [[GBL_TIDV]])
266 // CHECK:  ret void
267 
268 // CHECK-LABEL: test_precond
269 void test_precond() {
270   char a = 0; char i;
271   #pragma omp target
272   #pragma omp teams
273 #ifdef OMP5
274   #pragma omp distribute simd linear(i) if(a)
275 #else
276   #pragma omp distribute simd linear(i)
277 #endif // OMP5
278   for(i = a; i < 10; ++i);
279 }
280 
281 // a is passed as a parameter to the outlined functions
282 // CHECK:  define {{.*}}void @.omp_outlined.{{.*}}(i32* noalias [[GBL_TIDP:%.+]], i32* noalias [[BND_TID:%.+]], i8* dereferenceable({{[0-9]+}}) [[APARM:%.+]])
283 // CHECK:  store i8* [[APARM]], i8** [[APTRADDR:%.+]]
284 // ..many loads of %0..
285 // CHECK:  [[A2:%.+]] = load i8*, i8** [[APTRADDR]]
286 // CHECK:  [[AVAL0:%.+]] = load i8, i8* [[A2]]
287 // CHECK:  store i8 [[AVAL0]], i8* [[CAP_EXPR:%.+]],
288 // CHECK:  [[AVAL1:%.+]] = load i8, i8* [[CAP_EXPR]]
289 // CHECK:  load i8, i8* [[CAP_EXPR]]
290 // CHECK:  [[AVAL2:%.+]] = load i8, i8* [[CAP_EXPR]]
291 // CHECK:  [[ACONV:%.+]] = sext i8 [[AVAL2]] to i32
292 // CHECK:  [[ACMP:%.+]] = icmp slt i32 [[ACONV]], 10
293 // CHECK:  br i1 [[ACMP]], label %[[PRECOND_THEN:.+]], label %[[PRECOND_END:.+]]
294 // CHECK:  [[PRECOND_THEN]]
295 // CHECK:  call void @__kmpc_for_static_init_4
296 // CHECK:  call void @__kmpc_for_static_fini
297 // CHECK:  [[PRECOND_END]]
298 
299 // no templates for now, as these require special handling in target regions and/or declare target
300 
301 // HCHECK-LABEL: fint
302 // HCHECK: call {{.*}}i32 {{.+}}ftemplate
303 // HCHECK: ret i32
304 
305 // HCHECK: load i16, i16*
306 // HCHECK: store i16 %
307 // HCHECK: call i32 @__tgt_target_teams(
308 // HCHECK: call void @__kmpc_for_static_init_4(
309 template <typename T>
310 T ftemplate() {
311   short aa = 0;
312 
313 #pragma omp target
314 #pragma omp teams
315 #pragma omp distribute simd dist_schedule(static, aa)
316   for (int i = 0; i < 100; i++) {
317   }
318   return T();
319 }
320 
321 int fint(void) { return ftemplate<int>(); }
322 
323 #endif
324 
325 // OMP45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
326 // CHECK-DAG: !{!"llvm.loop.vectorize.width", i32 8}
327 // CHECK-DAG: !{!"llvm.loop.vectorize.enable", i1 true}
328 // CHECK-DAG: !{!"llvm.loop.vectorize.width", i32 32}
329 // OMP45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
330 // OMP50-DAG: !{!"llvm.loop.vectorize.enable", i1 false}
331