blob: 3671f44e58d7d8c75b45d4fb65addb0b71a2ed52 [file] [log] [blame]
Samuel Antaoee8fb302016-01-06 13:42:12 +00001// Test host codegen.
Samuel Antao1168d63c2016-06-30 21:22:08 +00002// 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
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
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
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
Samuel Antaoee8fb302016-01-06 13:42:12 +00008
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00009// 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
10// 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
11// 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
12// 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
13// 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
14// 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
15// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
16
Samuel Antaoee8fb302016-01-06 13:42:12 +000017// Test target codegen - host bc file has to be created first.
Samuel Antao1168d63c2016-06-30 21:22:08 +000018// 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
19// 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 TCHECK --check-prefix TCHECK-64
20// 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
21// 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 TCHECK --check-prefix TCHECK-64
22// 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
23// 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 TCHECK --check-prefix TCHECK-32
24// 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
25// 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 TCHECK --check-prefix TCHECK-32
Samuel Antaoee8fb302016-01-06 13:42:12 +000026
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000027// 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
28// 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
29// 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
30// 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
31// 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
32// 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
33// 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
34// 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
35// SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
36
Samuel Antaobed3c462015-10-02 16:14:20 +000037// expected-no-diagnostics
38#ifndef HEADER
39#define HEADER
40
41// CHECK-DAG: [[TT:%.+]] = type { i64, i8 }
42// CHECK-DAG: [[S1:%.+]] = type { double }
Samuel Antaof83efdb2017-01-05 16:02:49 +000043// CHECK-DAG: [[ENTTY:%.+]] = type { i8*, i8*, i[[SZ:32|64]], i32, i32 }
Samuel Antaoee8fb302016-01-06 13:42:12 +000044// CHECK-DAG: [[DEVTY:%.+]] = type { i8*, i8*, [[ENTTY]]*, [[ENTTY]]* }
45// CHECK-DAG: [[DSCTY:%.+]] = type { i32, [[DEVTY]]*, [[ENTTY]]*, [[ENTTY]]* }
46
Samuel Antaof83efdb2017-01-05 16:02:49 +000047// TCHECK: [[ENTTY:%.+]] = type { i8*, i8*, i{{32|64}}, i32, i32 }
Samuel Antaobed3c462015-10-02 16:14:20 +000048
George Rokos29d0f002017-05-27 03:03:13 +000049// CHECK-DAG: $[[REGFN:\.omp_offloading\..+]] = comdat
50
Samuel Antaobed3c462015-10-02 16:14:20 +000051// We have 8 target regions, but only 7 that actually will generate offloading
52// code, only 6 will have mapped arguments, and only 4 have all-constant map
53// sizes.
54
Alexey Bataevafe50572017-10-06 17:00:28 +000055// CHECK-DAG: [[SIZET:@.+]] = private unnamed_addr constant [2 x i[[SZ]]] [i[[SZ]] 0, i[[SZ]] 4]
George Rokos63bc9d62017-11-21 18:25:12 +000056// CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [2 x i64] [i64 32, i64 288]
Alexey Bataevafe50572017-10-06 17:00:28 +000057// CHECK-DAG: [[SIZET2:@.+]] = private unnamed_addr constant [1 x i{{32|64}}] [i[[SZ]] 2]
George Rokos63bc9d62017-11-21 18:25:12 +000058// CHECK-DAG: [[MAPT2:@.+]] = private unnamed_addr constant [1 x i64] [i64 288]
Samuel Antaobed3c462015-10-02 16:14:20 +000059// CHECK-DAG: [[SIZET3:@.+]] = private unnamed_addr constant [2 x i[[SZ]]] [i[[SZ]] 4, i[[SZ]] 2]
George Rokos63bc9d62017-11-21 18:25:12 +000060// CHECK-DAG: [[MAPT3:@.+]] = private unnamed_addr constant [2 x i64] [i64 288, i64 288]
61// CHECK-DAG: [[MAPT4:@.+]] = private unnamed_addr constant [9 x i64] [i64 288, i64 547, i64 288, i64 547, i64 547, i64 288, i64 288, i64 547, i64 547]
Samuel Antaobed3c462015-10-02 16:14:20 +000062// CHECK-DAG: [[SIZET5:@.+]] = private unnamed_addr constant [3 x i[[SZ]]] [i[[SZ]] 4, i[[SZ]] 2, i[[SZ]] 40]
George Rokos63bc9d62017-11-21 18:25:12 +000063// CHECK-DAG: [[MAPT5:@.+]] = private unnamed_addr constant [3 x i64] [i64 288, i64 288, i64 547]
Samuel Antaobed3c462015-10-02 16:14:20 +000064// CHECK-DAG: [[SIZET6:@.+]] = private unnamed_addr constant [4 x i[[SZ]]] [i[[SZ]] 4, i[[SZ]] 2, i[[SZ]] 1, i[[SZ]] 40]
George Rokos63bc9d62017-11-21 18:25:12 +000065// CHECK-DAG: [[MAPT6:@.+]] = private unnamed_addr constant [4 x i64] [i64 288, i64 288, i64 288, i64 547]
66// CHECK-DAG: [[MAPT7:@.+]] = private unnamed_addr constant [5 x i64] [i64 547, i64 288, i64 288, i64 288, i64 547]
Samuel Antaobed3c462015-10-02 16:14:20 +000067// CHECK-DAG: @{{.*}} = private constant i8 0
68// CHECK-DAG: @{{.*}} = private constant i8 0
69// CHECK-DAG: @{{.*}} = private constant i8 0
70// CHECK-DAG: @{{.*}} = private constant i8 0
71// CHECK-DAG: @{{.*}} = private constant i8 0
72// CHECK-DAG: @{{.*}} = private constant i8 0
73// CHECK-DAG: @{{.*}} = private constant i8 0
74
Samuel Antaoee8fb302016-01-06 13:42:12 +000075// TCHECK: @{{.+}} = constant [[ENTTY]]
76// TCHECK: @{{.+}} = constant [[ENTTY]]
77// TCHECK: @{{.+}} = constant [[ENTTY]]
78// TCHECK: @{{.+}} = constant [[ENTTY]]
79// TCHECK: @{{.+}} = constant [[ENTTY]]
80// TCHECK: @{{.+}} = constant [[ENTTY]]
81// TCHECK: @{{.+}} = constant [[ENTTY]]
Alexey Bataevafe50572017-10-06 17:00:28 +000082// TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]]
Samuel Antaoee8fb302016-01-06 13:42:12 +000083// TCHECK-NOT: @{{.+}} = constant [[ENTTY]]
84
85// Check if offloading descriptor is created.
86// CHECK: [[ENTBEGIN:@.+]] = external constant [[ENTTY]]
87// CHECK: [[ENTEND:@.+]] = external constant [[ENTTY]]
88// CHECK: [[DEVBEGIN:@.+]] = external constant i8
89// CHECK: [[DEVEND:@.+]] = external constant i8
George Rokos29d0f002017-05-27 03:03:13 +000090// CHECK: [[IMAGES:@.+]] = internal unnamed_addr constant [1 x [[DEVTY]]] [{{.+}} { i8* [[DEVBEGIN]], i8* [[DEVEND]], [[ENTTY]]* [[ENTBEGIN]], [[ENTTY]]* [[ENTEND]] }], comdat($[[REGFN]])
91// CHECK: [[DESC:@.+]] = internal constant [[DSCTY]] { i32 1, [[DEVTY]]* getelementptr inbounds ([1 x [[DEVTY]]], [1 x [[DEVTY]]]* [[IMAGES]], i32 0, i32 0), [[ENTTY]]* [[ENTBEGIN]], [[ENTTY]]* [[ENTEND]] }, comdat($[[REGFN]])
Samuel Antaoee8fb302016-01-06 13:42:12 +000092
93// Check target registration is registered as a Ctor.
George Rokos29d0f002017-05-27 03:03:13 +000094// CHECK: appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* bitcast (void (i8*)* @[[REGFN]] to void ()*), i8* bitcast (void (i8*)* @[[REGFN]] to i8*) }]
Samuel Antaoee8fb302016-01-06 13:42:12 +000095
96
Samuel Antaobed3c462015-10-02 16:14:20 +000097template<typename tx, typename ty>
98struct TT{
99 tx X;
100 ty Y;
101};
102
Alexey Bataeve85de8f2017-09-20 20:11:31 +0000103int global;
104extern int global;
105
Samuel Antaobed3c462015-10-02 16:14:20 +0000106// CHECK: define {{.*}}[[FOO:@.+]](
107int foo(int n) {
108 int a = 0;
109 short aa = 0;
110 float b[10];
111 float bn[n];
112 double c[5][10];
113 double cn[5][n];
114 TT<long long, char> d;
Alexey Bataevafe50572017-10-06 17:00:28 +0000115 static long *plocal;
Samuel Antaobed3c462015-10-02 16:14:20 +0000116
Alexey Bataev931e19b2017-10-02 16:32:39 +0000117 // CHECK: [[ADD:%.+]] = add nsw i32
Alexey Bataev8451efa2018-01-15 19:06:12 +0000118 // CHECK: store i32 [[ADD]], i32* [[DEVICE_CAP:%.+]],
119 // CHECK: [[DEV:%.+]] = load i32, i32* [[DEVICE_CAP]],
120 // CHECK: [[DEVICE:%.+]] = sext i32 [[DEV]] to i64
George Rokos63bc9d62017-11-21 18:25:12 +0000121 // CHECK: [[RET:%.+]] = call i32 @__tgt_target(i64 [[DEVICE]], i8* @{{[^,]+}}, i32 0, i8** null, i8** null, i[[SZ]]* null, i64* null)
Alexey Bataev2a007e02017-10-02 14:20:58 +0000122 // CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
Samuel Antaobed3c462015-10-02 16:14:20 +0000123 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
124 // CHECK: [[FAIL]]
125 // CHECK: call void [[HVT0:@.+]]()
126 // CHECK-NEXT: br label %[[END]]
127 // CHECK: [[END]]
Alexey Bataev931e19b2017-10-02 16:32:39 +0000128 #pragma omp target device(global + a)
Samuel Antaobed3c462015-10-02 16:14:20 +0000129 {
130 }
131
Alexey Bataev2ba67042017-11-28 21:11:44 +0000132 // CHECK-DAG: [[ADD:%.+]] = add nsw i32
Alexey Bataev8451efa2018-01-15 19:06:12 +0000133 // CHECK-DAG: store i32 [[ADD]], i32* [[DEVICE_CAP:%.+]],
134 // CHECK-DAG: [[DEV:%.+]] = load i32, i32* [[DEVICE_CAP]],
135 // CHECK-DAG: [[DEVICE:%.+]] = sext i32 [[DEV]] to i64
Alexey Bataeva9f77c62017-12-13 21:04:20 +0000136 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_nowait(i64 [[DEVICE]], i8* @{{[^,]+}}, i32 2, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* getelementptr inbounds ([2 x i[[SZ]]], [2 x i[[SZ]]]* [[SIZET]], i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[MAPT]], i32 0, i32 0)
Alexey Bataevafe50572017-10-06 17:00:28 +0000137 // CHECK-DAG: [[BPR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP:%[^,]+]], i32 0, i32 0
138 // CHECK-DAG: [[PR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P:%[^,]+]], i32 0, i32 0
139
140 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 0
141 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 0
142 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]**
143 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]**
144 // CHECK-DAG: store i[[SZ]]* [[BP0:%[^,]+]], i[[SZ]]** [[CBPADDR0]]
145 // CHECK-DAG: store i[[SZ]]* [[BP0]], i[[SZ]]** [[CPADDR0]]
146
147 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 1
148 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 1
149 // CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
150 // CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
151 // CHECK-DAG: store i[[SZ]] [[BP1:%[^,]+]], i[[SZ]]* [[CBPADDR1]]
152 // CHECK-DAG: store i[[SZ]] [[BP1]], i[[SZ]]* [[CPADDR1]]
153 // CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
154 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
155 // CHECK: [[FAIL]]
156 // CHECK: call void [[HVT0_:@.+]](i[[SZ]]* [[BP0]], i[[SZ]] [[BP1]])
157 // CHECK-NEXT: br label %[[END]]
158 // CHECK: [[END]]
Alexey Bataeva9f77c62017-12-13 21:04:20 +0000159 #pragma omp target device(global + a) nowait
Alexey Bataevafe50572017-10-06 17:00:28 +0000160 {
161 static int local1;
162 *plocal = global;
163 local1 = global;
164 }
165
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000166 // CHECK: call void [[HVT1:@.+]](i[[SZ]] {{[^,]+}})
Alexey Bataevb7f18c32017-09-22 16:56:13 +0000167 #pragma omp target if(0) firstprivate(global)
Samuel Antaobed3c462015-10-02 16:14:20 +0000168 {
Alexey Bataeve85de8f2017-09-20 20:11:31 +0000169 global += 1;
Samuel Antaobed3c462015-10-02 16:14:20 +0000170 }
171
George Rokos63bc9d62017-11-21 18:25:12 +0000172 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 1, i8** [[BP:%[^,]+]], i8** [[P:%[^,]+]], i[[SZ]]* getelementptr inbounds ([1 x i[[SZ]]], [1 x i[[SZ]]]* [[SIZET2]], i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* [[MAPT2]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000173 // CHECK-DAG: [[BP]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BPR:%[^,]+]], i32 0, i32 0
174 // CHECK-DAG: [[P]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PR:%[^,]+]], i32 0, i32 0
175 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BPR]], i32 0, i32 [[IDX0:[0-9]+]]
176 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PR]], i32 0, i32 [[IDX0]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000177 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
178 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
179 // CHECK-DAG: store i[[SZ]] [[BP0:%[^,]+]], i[[SZ]]* [[CBPADDR0]]
180 // CHECK-DAG: store i[[SZ]] [[P0:%[^,]+]], i[[SZ]]* [[CPADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000181
Alexey Bataev2a007e02017-10-02 14:20:58 +0000182 // CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
Samuel Antaobed3c462015-10-02 16:14:20 +0000183 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
184 // CHECK: [[FAIL]]
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000185 // CHECK: call void [[HVT2:@.+]](i[[SZ]] {{[^,]+}})
Samuel Antaobed3c462015-10-02 16:14:20 +0000186 // CHECK-NEXT: br label %[[END]]
187 // CHECK: [[END]]
188 #pragma omp target if(1)
189 {
190 aa += 1;
191 }
192
193 // CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 10
194 // CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
195 // CHECK: [[IFTHEN]]
George Rokos63bc9d62017-11-21 18:25:12 +0000196 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 2, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* getelementptr inbounds ([2 x i[[SZ]]], [2 x i[[SZ]]]* [[SIZET3]], i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[MAPT3]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000197 // CHECK-DAG: [[BPR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP:%[^,]+]], i32 0, i32 0
198 // CHECK-DAG: [[PR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P:%[^,]+]], i32 0, i32 0
199
200 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 0
201 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 0
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000202 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
203 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
204 // CHECK-DAG: store i[[SZ]] [[BP0:%[^,]+]], i[[SZ]]* [[CBPADDR0]]
205 // CHECK-DAG: store i[[SZ]] [[P0:%[^,]+]], i[[SZ]]* [[CPADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000206
207 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 1
208 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 1
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000209 // CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
210 // CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
211 // CHECK-DAG: store i[[SZ]] [[BP1:%[^,]+]], i[[SZ]]* [[CBPADDR1]]
212 // CHECK-DAG: store i[[SZ]] [[P1:%[^,]+]], i[[SZ]]* [[CPADDR1]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000213 // CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
Samuel Antaobed3c462015-10-02 16:14:20 +0000214 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
215 // CHECK: [[FAIL]]
216 // CHECK: call void [[HVT3:@.+]]({{[^,]+}}, {{[^,]+}})
217 // CHECK-NEXT: br label %[[END]]
218 // CHECK: [[END]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000219 // CHECK-NEXT: br label %[[IFEND:.+]]
220 // CHECK: [[IFELSE]]
221 // CHECK: call void [[HVT3]]({{[^,]+}}, {{[^,]+}})
222 // CHECK-NEXT: br label %[[IFEND]]
223
224 // CHECK: [[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000225 #pragma omp target if(n>10)
226 {
227 a += 1;
228 aa += 1;
229 }
230
231 // We capture 3 VLA sizes in this target region
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000232 // CHECK-64: [[A_VAL:%.+]] = load i32, i32* %{{.+}},
233 // CHECK-64: [[A_ADDR:%.+]] = bitcast i[[SZ]]* [[A_CADDR:%.+]] to i32*
234 // CHECK-64: store i32 [[A_VAL]], i32* [[A_ADDR]],
235 // CHECK-64: [[A_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[A_CADDR]],
Samuel Antaobed3c462015-10-02 16:14:20 +0000236
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000237 // CHECK-32: [[A_VAL:%.+]] = load i32, i32* %{{.+}},
238 // CHECK-32: store i32 [[A_VAL]], i32* [[A_CADDR:%.+]],
239 // CHECK-32: [[A_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[A_CADDR]],
240
Alexey Bataev8451efa2018-01-15 19:06:12 +0000241 // CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 20
242 // CHECK: br i1 [[IF]], label %[[TRY:[^,]+]], label %[[IFELSE:[^,]+]]
243 // CHECK: [[TRY]]
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000244 // CHECK: [[BNSIZE:%.+]] = mul nuw i[[SZ]] [[VLA0:%.+]], 4
245 // CHECK: [[CNELEMSIZE2:%.+]] = mul nuw i[[SZ]] 5, [[VLA1:%.+]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000246 // CHECK: [[CNSIZE:%.+]] = mul nuw i[[SZ]] [[CNELEMSIZE2]], 8
247
George Rokos63bc9d62017-11-21 18:25:12 +0000248 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 9, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* [[SR:%[^,]+]], i64* getelementptr inbounds ([9 x i64], [9 x i64]* [[MAPT4]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000249 // CHECK-DAG: [[BPR]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP:%[^,]+]], i32 0, i32 0
250 // CHECK-DAG: [[PR]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P:%[^,]+]], i32 0, i32 0
251 // CHECK-DAG: [[SR]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S:%[^,]+]], i32 0, i32 0
252
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000253 // CHECK-DAG: [[SADDR0:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX0:0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000254 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX0]]
255 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX0]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000256 // CHECK-DAG: [[SADDR1:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX1:1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000257 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX1]]
258 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX1]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000259 // CHECK-DAG: [[SADDR2:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX2:2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000260 // CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX2]]
261 // CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX2]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000262 // CHECK-DAG: [[SADDR3:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX3:3]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000263 // CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX3]]
264 // CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX3]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000265 // CHECK-DAG: [[SADDR4:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX4:4]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000266 // CHECK-DAG: [[BPADDR4:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX4]]
267 // CHECK-DAG: [[PADDR4:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX4]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000268 // CHECK-DAG: [[SADDR5:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX5:5]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000269 // CHECK-DAG: [[BPADDR5:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX5]]
270 // CHECK-DAG: [[PADDR5:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX5]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000271 // CHECK-DAG: [[SADDR6:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX6:6]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000272 // CHECK-DAG: [[BPADDR6:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX6]]
273 // CHECK-DAG: [[PADDR6:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX6]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000274 // CHECK-DAG: [[SADDR7:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX7:7]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000275 // CHECK-DAG: [[BPADDR7:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX7]]
276 // CHECK-DAG: [[PADDR7:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX7]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000277 // CHECK-DAG: [[SADDR8:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX8:8]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000278 // CHECK-DAG: [[BPADDR8:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BP]], i32 0, i32 [[IDX8]]
279 // CHECK-DAG: [[PADDR8:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[P]], i32 0, i32 [[IDX8]]
280
281 // The names below are not necessarily consistent with the names used for the
282 // addresses above as some are repeated.
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000283 // CHECK-DAG: [[CBPADDR2:%.+]] = bitcast i8** [[BPADDR2]] to i[[SZ]]*
284 // CHECK-DAG: [[CPADDR2:%.+]] = bitcast i8** [[PADDR2]] to i[[SZ]]*
285 // CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CBPADDR2]]
286 // CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CPADDR2]]
287 // CHECK-DAG: store i[[SZ]] {{4|8}}, i[[SZ]]* [[SADDR2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000288
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000289 // CHECK-DAG: [[CBPADDR6:%.+]] = bitcast i8** [[BPADDR6]] to i[[SZ]]*
290 // CHECK-DAG: [[CPADDR6:%.+]] = bitcast i8** [[PADDR6]] to i[[SZ]]*
291 // CHECK-DAG: store i[[SZ]] [[VLA1]], i[[SZ]]* [[CBPADDR6]]
292 // CHECK-DAG: store i[[SZ]] [[VLA1]], i[[SZ]]* [[CPADDR6]]
293 // CHECK-DAG: store i[[SZ]] {{4|8}}, i[[SZ]]* [[SADDR6]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000294
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000295 // CHECK-DAG: [[CBPADDR5:%.+]] = bitcast i8** [[BPADDR5]] to i[[SZ]]*
296 // CHECK-DAG: [[CPADDR5:%.+]] = bitcast i8** [[PADDR5]] to i[[SZ]]*
297 // CHECK-DAG: store i[[SZ]] 5, i[[SZ]]* [[CBPADDR5]]
298 // CHECK-DAG: store i[[SZ]] 5, i[[SZ]]* [[CPADDR5]]
299 // CHECK-DAG: store i[[SZ]] {{4|8}}, i[[SZ]]* [[SADDR5]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000300
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000301 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
302 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
303 // CHECK-DAG: store i[[SZ]] [[A_CVAL]], i[[SZ]]* [[CBPADDR0]]
304 // CHECK-DAG: store i[[SZ]] [[A_CVAL]], i[[SZ]]* [[CPADDR0]]
305 // CHECK-DAG: store i[[SZ]] 4, i[[SZ]]* [[SADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000306
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000307 // CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to [10 x float]**
308 // CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to [10 x float]**
309 // CHECK-DAG: store [10 x float]* %{{.+}}, [10 x float]** [[CBPADDR1]]
310 // CHECK-DAG: store [10 x float]* %{{.+}}, [10 x float]** [[CPADDR1]]
311 // CHECK-DAG: store i[[SZ]] 40, i[[SZ]]* [[SADDR1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000312
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000313 // CHECK-DAG: [[CBPADDR3:%.+]] = bitcast i8** [[BPADDR3]] to float**
314 // CHECK-DAG: [[CPADDR3:%.+]] = bitcast i8** [[PADDR3]] to float**
315 // CHECK-DAG: store float* %{{.+}}, float** [[CBPADDR3]]
316 // CHECK-DAG: store float* %{{.+}}, float** [[CPADDR3]]
317 // CHECK-DAG: store i[[SZ]] [[BNSIZE]], i[[SZ]]* [[SADDR3]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000318
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000319 // CHECK-DAG: [[CBPADDR4:%.+]] = bitcast i8** [[BPADDR4]] to [5 x [10 x double]]**
320 // CHECK-DAG: [[CPADDR4:%.+]] = bitcast i8** [[PADDR4]] to [5 x [10 x double]]**
321 // CHECK-DAG: store [5 x [10 x double]]* %{{.+}}, [5 x [10 x double]]** [[CBPADDR4]]
322 // CHECK-DAG: store [5 x [10 x double]]* %{{.+}}, [5 x [10 x double]]** [[CPADDR4]]
323 // CHECK-DAG: store i[[SZ]] 400, i[[SZ]]* [[SADDR4]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000324
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000325 // CHECK-DAG: [[CBPADDR7:%.+]] = bitcast i8** [[BPADDR7]] to double**
326 // CHECK-DAG: [[CPADDR7:%.+]] = bitcast i8** [[PADDR7]] to double**
327 // CHECK-DAG: store double* %{{.+}}, double** [[CBPADDR7]]
328 // CHECK-DAG: store double* %{{.+}}, double** [[CPADDR7]]
329 // CHECK-DAG: store i[[SZ]] [[CNSIZE]], i[[SZ]]* [[SADDR7]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000330
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000331 // CHECK-DAG: [[CBPADDR8:%.+]] = bitcast i8** [[BPADDR8]] to [[TT]]**
332 // CHECK-DAG: [[CPADDR8:%.+]] = bitcast i8** [[PADDR8]] to [[TT]]**
333 // CHECK-DAG: store [[TT]]* %{{.+}}, [[TT]]** [[CBPADDR8]]
334 // CHECK-DAG: store [[TT]]* %{{.+}}, [[TT]]** [[CPADDR8]]
335 // CHECK-DAG: store i[[SZ]] {{12|16}}, i[[SZ]]* [[SADDR8]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000336
Alexey Bataev2a007e02017-10-02 14:20:58 +0000337 // CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
338 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000339 // CHECK: [[FAIL]]
340 // CHECK: call void [[HVT4:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
341 // CHECK-NEXT: br label %[[END]]
342 // CHECK: [[END]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000343 // CHECK-NEXT: br label %[[IFEND:.+]]
344 // CHECK: [[IFELSE]]
345 // CHECK: call void [[HVT4]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
346 // CHECK-NEXT: br label %[[IFEND]]
347
348 // CHECK: [[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000349 #pragma omp target if(n>20)
350 {
351 a += 1;
352 b[2] += 1.0;
353 bn[3] += 1.0;
354 c[1][2] += 1.0;
355 cn[1][3] += 1.0;
356 d.X += 1;
357 d.Y += 1;
358 }
359
360 return a;
361}
362
363// Check that the offloading functions are emitted and that the arguments are
364// correct and loaded correctly for the target regions in foo().
365
366// CHECK: define internal void [[HVT0]]()
367
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000368// CHECK: define internal void [[HVT1]](i[[SZ]] %{{.+}})
Samuel Antaobed3c462015-10-02 16:14:20 +0000369// Create stack storage and store argument in there.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000370// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
371// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
372// CHECK-64: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i32*
373// CHECK-64: load i32, i32* [[AA_CADDR]], align
374// CHECK-32: load i32, i32* [[AA_ADDR]], align
Samuel Antaobed3c462015-10-02 16:14:20 +0000375
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000376// CHECK: define internal void [[HVT2]](i[[SZ]] %{{.+}})
Samuel Antaobed3c462015-10-02 16:14:20 +0000377// Create stack storage and store argument in there.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000378// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
379// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
380// CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
381// CHECK: load i16, i16* [[AA_CADDR]], align
Samuel Antaobed3c462015-10-02 16:14:20 +0000382
383// CHECK: define internal void [[HVT3]]
384// Create stack storage and store argument in there.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000385// CHECK: [[A_ADDR:%.+]] = alloca i[[SZ]], align
386// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
387// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[A_ADDR]], align
388// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
389// CHECK-64-DAG:[[A_CADDR:%.+]] = bitcast i[[SZ]]* [[A_ADDR]] to i32*
390// CHECK-DAG: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
391// CHECK-64-DAG:load i32, i32* [[A_CADDR]], align
392// CHECK-32-DAG:load i32, i32* [[A_ADDR]], align
393// CHECK-DAG: load i16, i16* [[AA_CADDR]], align
Samuel Antaobed3c462015-10-02 16:14:20 +0000394
395// CHECK: define internal void [[HVT4]]
396// Create local storage for each capture.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000397// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
398// CHECK: [[LOCAL_B:%.+]] = alloca [10 x float]*
399// CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
400// CHECK: [[LOCAL_BN:%.+]] = alloca float*
401// CHECK: [[LOCAL_C:%.+]] = alloca [5 x [10 x double]]*
402// CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
403// CHECK: [[LOCAL_VLA3:%.+]] = alloca i[[SZ]]
404// CHECK: [[LOCAL_CN:%.+]] = alloca double*
405// CHECK: [[LOCAL_D:%.+]] = alloca [[TT]]*
406// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000407// CHECK-DAG: store [10 x float]* [[ARG_B:%.+]], [10 x float]** [[LOCAL_B]]
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000408// CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000409// CHECK-DAG: store float* [[ARG_BN:%.+]], float** [[LOCAL_BN]]
410// CHECK-DAG: store [5 x [10 x double]]* [[ARG_C:%.+]], [5 x [10 x double]]** [[LOCAL_C]]
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000411// CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
412// CHECK-DAG: store i[[SZ]] [[ARG_VLA3:%.+]], i[[SZ]]* [[LOCAL_VLA3]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000413// CHECK-DAG: store double* [[ARG_CN:%.+]], double** [[LOCAL_CN]]
414// CHECK-DAG: store [[TT]]* [[ARG_D:%.+]], [[TT]]** [[LOCAL_D]]
415
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000416// CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
Samuel Antaobed3c462015-10-02 16:14:20 +0000417// CHECK-DAG: [[REF_B:%.+]] = load [10 x float]*, [10 x float]** [[LOCAL_B]],
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000418// CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
Samuel Antaobed3c462015-10-02 16:14:20 +0000419// CHECK-DAG: [[REF_BN:%.+]] = load float*, float** [[LOCAL_BN]],
420// CHECK-DAG: [[REF_C:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[LOCAL_C]],
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000421// CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
422// CHECK-DAG: [[VAL_VLA3:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA3]],
Samuel Antaobed3c462015-10-02 16:14:20 +0000423// CHECK-DAG: [[REF_CN:%.+]] = load double*, double** [[LOCAL_CN]],
424// CHECK-DAG: [[REF_D:%.+]] = load [[TT]]*, [[TT]]** [[LOCAL_D]],
425
426// Use captures.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000427// CHECK-64-DAG: load i32, i32* [[REF_A]]
428// CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000429// CHECK-DAG: getelementptr inbounds [10 x float], [10 x float]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
430// CHECK-DAG: getelementptr inbounds float, float* [[REF_BN]], i[[SZ]] 3
431// CHECK-DAG: getelementptr inbounds [5 x [10 x double]], [5 x [10 x double]]* [[REF_C]], i[[SZ]] 0, i[[SZ]] 1
432// CHECK-DAG: getelementptr inbounds double, double* [[REF_CN]], i[[SZ]] %{{.+}}
433// CHECK-DAG: getelementptr inbounds [[TT]], [[TT]]* [[REF_D]], i32 0, i32 0
434
435template<typename tx>
436tx ftemplate(int n) {
437 tx a = 0;
438 short aa = 0;
439 tx b[10];
440
441 #pragma omp target if(n>40)
442 {
443 a += 1;
444 aa += 1;
445 b[2] += 1;
446 }
447
448 return a;
449}
450
451static
452int fstatic(int n) {
453 int a = 0;
454 short aa = 0;
455 char aaa = 0;
456 int b[10];
457
458 #pragma omp target if(n>50)
459 {
460 a += 1;
461 aa += 1;
462 aaa += 1;
463 b[2] += 1;
464 }
465
466 return a;
467}
468
469struct S1 {
470 double a;
471
472 int r1(int n){
473 int b = n+1;
474 short int c[2][n];
475
476 #pragma omp target if(n>60)
477 {
478 this->a = (double)b + 1.5;
479 c[1][1] = ++a;
480 }
481
482 return c[1][1] + (int)b;
483 }
484};
485
486// CHECK: define {{.*}}@{{.*}}bar{{.*}}
487int bar(int n){
488 int a = 0;
489
490 // CHECK: call {{.*}}i32 [[FOO]](i32 {{.*}})
491 a += foo(n);
492
493 S1 S;
494 // CHECK: call {{.*}}i32 [[FS1:@.+]]([[S1]]* {{.*}}, i32 {{.*}})
495 a += S.r1(n);
496
497 // CHECK: call {{.*}}i32 [[FSTATIC:@.+]](i32 {{.*}})
498 a += fstatic(n);
499
500 // CHECK: call {{.*}}i32 [[FTEMPLATE:@.+]](i32 {{.*}})
501 a += ftemplate<int>(n);
502
503 return a;
504}
505
506//
507// CHECK: define {{.*}}[[FS1]]
508//
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000509// CHECK: i8* @llvm.stacksave()
510// CHECK-64: [[B_ADDR:%.+]] = bitcast i[[SZ]]* [[B_CADDR:%.+]] to i32*
511// CHECK-64: store i32 %{{.+}}, i32* [[B_ADDR]],
512// CHECK-64: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_CADDR]],
513
514// CHECK-32: store i32 %{{.+}}, i32* [[B_ADDR:%.+]],
515// CHECK-32: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_ADDR]],
516
Alexey Bataev8451efa2018-01-15 19:06:12 +0000517// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 60
518// CHECK: br i1 [[IF]], label %[[TRY:[^,]+]], label %[[IFELSE:[^,]+]]
519// CHECK: [[TRY]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000520// We capture 2 VLA sizes in this target region
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000521// CHECK: [[CELEMSIZE2:%.+]] = mul nuw i[[SZ]] 2, [[VLA0:%.+]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000522// CHECK: [[CSIZE:%.+]] = mul nuw i[[SZ]] [[CELEMSIZE2]], 2
523
George Rokos63bc9d62017-11-21 18:25:12 +0000524// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 5, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* [[SR:%[^,]+]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPT7]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000525// CHECK-DAG: [[BPR]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP:%.+]], i32 0, i32 0
526// CHECK-DAG: [[PR]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P:%.+]], i32 0, i32 0
527// CHECK-DAG: [[SR]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S:%.+]], i32 0, i32 0
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000528// CHECK-DAG: [[SADDR0:%.+]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX0:0]]
529// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 [[IDX0]]
530// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 [[IDX0]]
531// CHECK-DAG: [[SADDR1:%.+]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX1:1]]
532// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 [[IDX1]]
533// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 [[IDX1]]
534// CHECK-DAG: [[SADDR2:%.+]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX2:2]]
535// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 [[IDX2]]
536// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 [[IDX2]]
537// CHECK-DAG: [[SADDR3:%.+]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX3:3]]
538// CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 [[IDX3]]
539// CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 [[IDX3]]
540// CHECK-DAG: [[SADDR4:%.+]] = getelementptr inbounds [5 x i[[SZ]]], [5 x i[[SZ]]]* [[S]], i32 0, i32 [[IDX4:4]]
541// CHECK-DAG: [[BPADDR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 [[IDX4]]
542// CHECK-DAG: [[PADDR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 [[IDX4]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000543
544// The names below are not necessarily consistent with the names used for the
545// addresses above as some are repeated.
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000546// CHECK-DAG: [[CBPADDR3:%.+]] = bitcast i8** [[BPADDR3]] to i[[SZ]]*
547// CHECK-DAG: [[CPADDR3:%.+]] = bitcast i8** [[PADDR3]] to i[[SZ]]*
548// CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CBPADDR3]]
549// CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CPADDR3]]
550// CHECK-DAG: store i[[SZ]] {{4|8}}, i[[SZ]]* [[SADDR3]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000551
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000552// CHECK-DAG: [[CBPADDR2:%.+]] = bitcast i8** [[BPADDR2]] to i[[SZ]]*
553// CHECK-DAG: [[CPADDR2:%.+]] = bitcast i8** [[PADDR2]] to i[[SZ]]*
554// CHECK-DAG: store i[[SZ]] 2, i[[SZ]]* [[CBPADDR2]]
555// CHECK-DAG: store i[[SZ]] 2, i[[SZ]]* [[CPADDR2]]
556// CHECK-DAG: store i[[SZ]] {{4|8}}, i[[SZ]]* [[SADDR2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000557
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000558// CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
559// CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
560// CHECK-DAG: store i[[SZ]] [[B_CVAL]], i[[SZ]]* [[CBPADDR1]]
561// CHECK-DAG: store i[[SZ]] [[B_CVAL]], i[[SZ]]* [[CPADDR1]]
562// CHECK-DAG: store i[[SZ]] 4, i[[SZ]]* [[SADDR1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000563
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000564// CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to [[S1]]**
Alexey Bataevf47c4b42017-09-26 13:47:31 +0000565// CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to double**
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000566// CHECK-DAG: store [[S1]]* %{{.+}}, [[S1]]** [[CBPADDR0]]
Alexey Bataevf47c4b42017-09-26 13:47:31 +0000567// CHECK-DAG: store double* %{{.+}}, double** [[CPADDR0]]
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000568// CHECK-DAG: store i[[SZ]] 8, i[[SZ]]* [[SADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000569
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000570// CHECK-DAG: [[CBPADDR4:%.+]] = bitcast i8** [[BPADDR4]] to i16**
571// CHECK-DAG: [[CPADDR4:%.+]] = bitcast i8** [[PADDR4]] to i16**
572// CHECK-DAG: store i16* %{{.+}}, i16** [[CBPADDR4]]
573// CHECK-DAG: store i16* %{{.+}}, i16** [[CPADDR4]]
574// CHECK-DAG: store i[[SZ]] [[CSIZE]], i[[SZ]]* [[SADDR4]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000575
Alexey Bataev2a007e02017-10-02 14:20:58 +0000576// CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
577// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000578// CHECK: [[FAIL]]
579// CHECK: call void [[HVT7:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
580// CHECK-NEXT: br label %[[END]]
581// CHECK: [[END]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000582// CHECK-NEXT: br label %[[IFEND:.+]]
583// CHECK: [[IFELSE]]
584// CHECK: call void [[HVT7]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
585// CHECK-NEXT: br label %[[IFEND]]
586
587// CHECK: [[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000588
589//
590// CHECK: define {{.*}}[[FSTATIC]]
591//
592// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 50
593// CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
594// CHECK: [[IFTHEN]]
George Rokos63bc9d62017-11-21 18:25:12 +0000595// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 4, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* getelementptr inbounds ([4 x i[[SZ]]], [4 x i[[SZ]]]* [[SIZET6]], i32 0, i32 0), i64* getelementptr inbounds ([4 x i64], [4 x i64]* [[MAPT6]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000596// CHECK-DAG: [[BPR]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[BP:%.+]], i32 0, i32 0
597// CHECK-DAG: [[PR]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[P:%.+]], i32 0, i32 0
598
599// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[BP]], i32 0, i32 0
600// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[P]], i32 0, i32 0
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000601// CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
602// CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
603// CHECK-DAG: store i[[SZ]] [[VAL0:%[^,]+]], i[[SZ]]* [[CBPADDR0]]
604// CHECK-DAG: store i[[SZ]] [[VAL0]], i[[SZ]]* [[CPADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000605
606// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[BP]], i32 0, i32 1
607// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[P]], i32 0, i32 1
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000608// CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
609// CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
610// CHECK-DAG: store i[[SZ]] [[VAL1:%[^,]+]], i[[SZ]]* [[CBPADDR1]]
611// CHECK-DAG: store i[[SZ]] [[VAL1]], i[[SZ]]* [[CPADDR1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000612
613// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[BP]], i32 0, i32 2
614// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[P]], i32 0, i32 2
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000615// CHECK-DAG: [[CBPADDR2:%.+]] = bitcast i8** [[BPADDR2]] to i[[SZ]]*
616// CHECK-DAG: [[CPADDR2:%.+]] = bitcast i8** [[PADDR2]] to i[[SZ]]*
617// CHECK-DAG: store i[[SZ]] [[VAL2:%[^,]+]], i[[SZ]]* [[CBPADDR2]]
618// CHECK-DAG: store i[[SZ]] [[VAL2]], i[[SZ]]* [[CPADDR2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000619
620// CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[BP]], i32 0, i32 3
621// CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[P]], i32 0, i32 3
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000622// CHECK-DAG: [[CBPADDR3:%.+]] = bitcast i8** [[BPADDR3]] to [10 x i32]**
623// CHECK-DAG: [[CPADDR3:%.+]] = bitcast i8** [[PADDR3]] to [10 x i32]**
624// CHECK-DAG: store [10 x i32]* [[VAL3:%[^,]+]], [10 x i32]** [[CBPADDR3]]
625// CHECK-DAG: store [10 x i32]* [[VAL3]], [10 x i32]** [[CPADDR3]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000626
Alexey Bataev2a007e02017-10-02 14:20:58 +0000627// CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
Samuel Antaobed3c462015-10-02 16:14:20 +0000628// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
629// CHECK: [[FAIL]]
630// CHECK: call void [[HVT6:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
631// CHECK-NEXT: br label %[[END]]
632// CHECK: [[END]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000633// CHECK-NEXT: br label %[[IFEND:.+]]
634// CHECK: [[IFELSE]]
635// CHECK: call void [[HVT6]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
636// CHECK-NEXT: br label %[[IFEND]]
637
638// CHECK: [[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000639
640//
641// CHECK: define {{.*}}[[FTEMPLATE]]
642//
643// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 40
644// CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
645// CHECK: [[IFTHEN]]
George Rokos63bc9d62017-11-21 18:25:12 +0000646// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 3, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i[[SZ]]* getelementptr inbounds ([3 x i[[SZ]]], [3 x i[[SZ]]]* [[SIZET5]], i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* [[MAPT5]], i32 0, i32 0))
Samuel Antaobed3c462015-10-02 16:14:20 +0000647// CHECK-DAG: [[BPR]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP:%.+]], i32 0, i32 0
648// CHECK-DAG: [[PR]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P:%.+]], i32 0, i32 0
649
650// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 0
651// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 0
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000652// CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
653// CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
654// CHECK-DAG: store i[[SZ]] [[VAL0:%[^,]+]], i[[SZ]]* [[CBPADDR0]]
655// CHECK-DAG: store i[[SZ]] [[VAL0]], i[[SZ]]* [[CPADDR0]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000656
657// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 1
658// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 1
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000659// CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
660// CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
661// CHECK-DAG: store i[[SZ]] [[VAL1:%[^,]+]], i[[SZ]]* [[CBPADDR1]]
662// CHECK-DAG: store i[[SZ]] [[VAL1]], i[[SZ]]* [[CPADDR1]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000663
664// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 2
665// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 2
Alexey Bataev1fdfdf72017-06-29 16:43:05 +0000666// CHECK-DAG: [[CBPADDR2:%.+]] = bitcast i8** [[BPADDR2]] to [10 x i32]**
667// CHECK-DAG: [[CPADDR2:%.+]] = bitcast i8** [[PADDR2]] to [10 x i32]**
668// CHECK-DAG: store [10 x i32]* [[VAL2:%[^,]+]], [10 x i32]** [[CBPADDR2]]
669// CHECK-DAG: store [10 x i32]* [[VAL2]], [10 x i32]** [[CPADDR2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000670
Alexey Bataev2a007e02017-10-02 14:20:58 +0000671// CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
Samuel Antaobed3c462015-10-02 16:14:20 +0000672// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
673// CHECK: [[FAIL]]
674// CHECK: call void [[HVT5:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}})
675// CHECK-NEXT: br label %[[END]]
676// CHECK: [[END]]
Alexey Bataev2a007e02017-10-02 14:20:58 +0000677// CHECK-NEXT: br label %[[IFEND:.+]]
678// CHECK: [[IFELSE]]
679// CHECK: call void [[HVT5]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}})
680// CHECK-NEXT: br label %[[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000681
Alexey Bataev2a007e02017-10-02 14:20:58 +0000682// CHECK: [[IFEND]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000683
684
685// Check that the offloading functions are emitted and that the arguments are
686// correct and loaded correctly for the target regions of the callees of bar().
687
688// CHECK: define internal void [[HVT7]]
689// Create local storage for each capture.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000690// CHECK: [[LOCAL_THIS:%.+]] = alloca [[S1]]*
691// CHECK: [[LOCAL_B:%.+]] = alloca i[[SZ]]
692// CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
693// CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
694// CHECK: [[LOCAL_C:%.+]] = alloca i16*
Samuel Antaobed3c462015-10-02 16:14:20 +0000695// CHECK-DAG: store [[S1]]* [[ARG_THIS:%.+]], [[S1]]** [[LOCAL_THIS]]
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000696// CHECK-DAG: store i[[SZ]] [[ARG_B:%.+]], i[[SZ]]* [[LOCAL_B]]
697// CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
698// CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000699// CHECK-DAG: store i16* [[ARG_C:%.+]], i16** [[LOCAL_C]]
700// Store captures in the context.
701// CHECK-DAG: [[REF_THIS:%.+]] = load [[S1]]*, [[S1]]** [[LOCAL_THIS]],
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000702// CHECK-64-DAG:[[REF_B:%.+]] = bitcast i[[SZ]]* [[LOCAL_B]] to i32*
703// CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
704// CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
Samuel Antaobed3c462015-10-02 16:14:20 +0000705// CHECK-DAG: [[REF_C:%.+]] = load i16*, i16** [[LOCAL_C]],
706// Use captures.
707// CHECK-DAG: getelementptr inbounds [[S1]], [[S1]]* [[REF_THIS]], i32 0, i32 0
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000708// CHECK-64-DAG:load i32, i32* [[REF_B]]
709// CHECK-32-DAG:load i32, i32* [[LOCAL_B]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000710// CHECK-DAG: getelementptr inbounds i16, i16* [[REF_C]], i[[SZ]] %{{.+}}
711
712
713// CHECK: define internal void [[HVT6]]
714// Create local storage for each capture.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000715// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
716// CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
717// CHECK: [[LOCAL_AAA:%.+]] = alloca i[[SZ]]
718// CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
719// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
720// CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
721// CHECK-DAG: store i[[SZ]] [[ARG_AAA:%.+]], i[[SZ]]* [[LOCAL_AAA]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000722// CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
723// Store captures in the context.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000724// CHECK-64-DAG: [[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
725// CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
726// CHECK-DAG: [[REF_AAA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA]] to i8*
727// CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
Samuel Antaobed3c462015-10-02 16:14:20 +0000728// Use captures.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000729// CHECK-64-DAG: load i32, i32* [[REF_A]]
730// CHECK-DAG: load i16, i16* [[REF_AA]]
731// CHECK-DAG: load i8, i8* [[REF_AAA]]
732// CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
733// CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
Samuel Antaobed3c462015-10-02 16:14:20 +0000734
735// CHECK: define internal void [[HVT5]]
736// Create local storage for each capture.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000737// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
738// CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
739// CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
740// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
741// CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000742// CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
743// Store captures in the context.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000744// CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
745// CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
Samuel Antaobed3c462015-10-02 16:14:20 +0000746// CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
747// Use captures.
Samuel Antao4af1b7b2015-12-02 17:44:43 +0000748// CHECK-64-DAG: load i32, i32* [[REF_A]]
749// CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
Samuel Antaobed3c462015-10-02 16:14:20 +0000750// CHECK-DAG: load i16, i16* [[REF_AA]]
751// CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
752#endif