blob: feb6b46d187c90234ce0b0acc7357623fc57302e [file] [log] [blame]
Alexey Bataevdfa430f2017-12-08 15:03:50 +00001// Test host codegen.
Joel E. Denny72c27832018-07-11 20:26:20 +00002// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64
Alexey Bataevdfa430f2017-12-08 15:03:50 +00003// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
Joel E. Denny72c27832018-07-11 20:26:20 +00004// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64
5// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32
Alexey Bataevdfa430f2017-12-08 15:03:50 +00006// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
Joel E. Denny72c27832018-07-11 20:26:20 +00007// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32
Alexey Bataevdfa430f2017-12-08 15:03:50 +00008
Joel E. Denny72c27832018-07-11 20:26:20 +00009// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000010// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
Joel E. Denny72c27832018-07-11 20:26:20 +000011// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s
12// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000013// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
Joel E. Denny72c27832018-07-11 20:26:20 +000014// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000015// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
16
Alexey Bataevdfa430f2017-12-08 15:03:50 +000017// Test target codegen - host bc file has to be created first.
18// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
Joel E. Denny72c27832018-07-11 20:26:20 +000019// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 -allow-deprecated-dag-overlap %s --check-prefix TCHECK --check-prefix TCHECK-64
Alexey Bataevdfa430f2017-12-08 15:03:50 +000020// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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
Joel E. Denny72c27832018-07-11 20:26:20 +000021// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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 -allow-deprecated-dag-overlap %s --check-prefix TCHECK --check-prefix TCHECK-64
Alexey Bataevdfa430f2017-12-08 15:03:50 +000022// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
Joel E. Denny72c27832018-07-11 20:26:20 +000023// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -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 -allow-deprecated-dag-overlap %s --check-prefix TCHECK --check-prefix TCHECK-32
Alexey Bataevdfa430f2017-12-08 15:03:50 +000024// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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
Joel E. Denny72c27832018-07-11 20:26:20 +000025// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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 -allow-deprecated-dag-overlap %s --check-prefix TCHECK --check-prefix TCHECK-32
Alexey Bataevdfa430f2017-12-08 15:03:50 +000026
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000027// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
Joel E. Denny72c27832018-07-11 20:26:20 +000028// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -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 -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000029// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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
Joel E. Denny72c27832018-07-11 20:26:20 +000030// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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 -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000031// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
Joel E. Denny72c27832018-07-11 20:26:20 +000032// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -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 -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000033// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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
Joel E. Denny72c27832018-07-11 20:26:20 +000034// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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 -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000035// SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
36
Alexey Bataevdfa430f2017-12-08 15:03:50 +000037// expected-no-diagnostics
38#ifndef HEADER
39#define HEADER
40
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000041// CHECK-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* }
Alexey Bataevdfa430f2017-12-08 15:03:50 +000042// CHECK-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
Mike Ricee1ca7b62018-08-29 15:45:11 +000043// CHECK-DAG: [[DEF_LOC:@.+]] = 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) }
Alexey Bataevdfa430f2017-12-08 15:03:50 +000044
45// CHECK-DAG: [[TT:%.+]] = type { i64, i8 }
46// CHECK-DAG: [[S1:%.+]] = type { double }
47// CHECK-DAG: [[ENTTY:%.+]] = type { i8*, i8*, i[[SZ:32|64]], i32, i32 }
48// CHECK-DAG: [[DEVTY:%.+]] = type { i8*, i8*, [[ENTTY]]*, [[ENTTY]]* }
49// CHECK-DAG: [[DSCTY:%.+]] = type { i32, [[DEVTY]]*, [[ENTTY]]*, [[ENTTY]]* }
50
51// TCHECK: [[ENTTY:%.+]] = type { i8*, i8*, i{{32|64}}, i32, i32 }
52
53// CHECK-DAG: $[[REGFN:\.omp_offloading\..+]] = comdat
54
55// We have 8 target regions, but only 7 that actually will generate offloading
56// code, only 6 will have mapped arguments, and only 4 have all-constant map
57// sizes.
58
Alexey Bataeva90fc662019-06-25 16:00:43 +000059// CHECK-DAG: [[SIZET:@.+]] = private unnamed_addr constant [3 x i64] [i64 2, i64 4, i64 4]
Alexey Bataevf288cf92019-06-27 18:53:07 +000060// CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 288, i64 800, i64 800]
Alexey Bataeva90fc662019-06-25 16:00:43 +000061// CHECK-DAG: [[SIZET2:@.+]] = private unnamed_addr constant [1 x i64] [i64 2]
Alexey Bataevb3638132018-07-19 16:34:13 +000062// CHECK-DAG: [[MAPT2:@.+]] = private unnamed_addr constant [1 x i64] [i64 800]
Alexey Bataeva90fc662019-06-25 16:00:43 +000063// CHECK-DAG: [[SIZET3:@.+]] = private unnamed_addr constant [2 x i64] [i64 4, i64 2]
Alexey Bataevb3638132018-07-19 16:34:13 +000064// CHECK-DAG: [[MAPT3:@.+]] = private unnamed_addr constant [2 x i64] [i64 800, i64 800]
Alexey Bataevf288cf92019-06-27 18:53:07 +000065// CHECK-DAG: [[MAPT4:@.+]] = private unnamed_addr constant [10 x i64] [i64 800, i64 547, i64 800, i64 547, i64 547, i64 800, i64 800, i64 547, i64 547, i64 800]
66// CHECK-DAG: [[MAPT5:@.+]] = private unnamed_addr constant [6 x i64] [i64 32, i64 281474976711171, i64 800, i64 800, i64 800, i64 547]
Alexey Bataeva90fc662019-06-25 16:00:43 +000067// CHECK-DAG: [[SIZET6:@.+]] = private unnamed_addr constant [5 x i64] [i64 4, i64 4, i64 2, i64 1, i64 40]
Alexey Bataevb3638132018-07-19 16:34:13 +000068// CHECK-DAG: [[MAPT6:@.+]] = private unnamed_addr constant [5 x i64] [i64 800, i64 800, i64 800, i64 800, i64 547]
Alexey Bataeva90fc662019-06-25 16:00:43 +000069// CHECK-DAG: [[SIZET7:@.+]] = private unnamed_addr constant [3 x i64] [i64 4, i64 2, i64 40]
Alexey Bataevb3638132018-07-19 16:34:13 +000070// CHECK-DAG: [[MAPT7:@.+]] = private unnamed_addr constant [3 x i64] [i64 800, i64 800, i64 547]
Alexey Bataev9a700172018-05-08 14:16:57 +000071// CHECK-DAG: @{{.*}} = weak constant i8 0
72// CHECK-DAG: @{{.*}} = weak constant i8 0
73// CHECK-DAG: @{{.*}} = weak constant i8 0
74// CHECK-DAG: @{{.*}} = weak constant i8 0
75// CHECK-DAG: @{{.*}} = weak constant i8 0
76// CHECK-DAG: @{{.*}} = weak constant i8 0
77// CHECK-DAG: @{{.*}} = weak constant i8 0
Alexey Bataevdfa430f2017-12-08 15:03:50 +000078
Alexey Bataev03f270c2018-03-30 18:31:07 +000079// TCHECK: @{{.+}} = weak constant [[ENTTY]]
80// TCHECK: @{{.+}} = weak constant [[ENTTY]]
81// TCHECK: @{{.+}} = weak constant [[ENTTY]]
82// TCHECK: @{{.+}} = weak constant [[ENTTY]]
83// TCHECK: @{{.+}} = weak constant [[ENTTY]]
84// TCHECK: @{{.+}} = weak constant [[ENTTY]]
85// TCHECK: @{{.+}} = weak constant [[ENTTY]]
86// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]]
Alexey Bataevdfa430f2017-12-08 15:03:50 +000087
88// Check if offloading descriptor is created.
Sergey Dmitriev4b343fd2019-09-27 20:00:51 +000089// CHECK: [[ENTBEGIN:@.+]] = external hidden constant [[ENTTY]]
90// CHECK: [[ENTEND:@.+]] = external hidden constant [[ENTTY]]
Alexey Bataev62a4cb02018-07-31 18:27:42 +000091// CHECK: [[DEVBEGIN:@.+]] = extern_weak constant i8
92// CHECK: [[DEVEND:@.+]] = extern_weak constant i8
Alexey Bataevdfa430f2017-12-08 15:03:50 +000093// CHECK: [[IMAGES:@.+]] = internal unnamed_addr constant [1 x [[DEVTY]]] [{{.+}} { i8* [[DEVBEGIN]], i8* [[DEVEND]], [[ENTTY]]* [[ENTBEGIN]], [[ENTTY]]* [[ENTEND]] }], comdat($[[REGFN]])
94// 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]])
95
96// Check target registration is registered as a Ctor.
Gheorghe-Teodor Bercea66cdbb472019-05-21 19:42:01 +000097// CHECK: appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @.omp_offloading.requires_reg, i8* null }, { i32, void ()*, i8* } { i32 0, void ()* @[[REGFN]], i8* bitcast (void ()* @[[REGFN]] to i8*) }]
Alexey Bataevdfa430f2017-12-08 15:03:50 +000098
99
100template<typename tx, typename ty>
101struct TT{
102 tx X;
103 ty Y;
104};
105
106int global;
107
108// CHECK: define {{.*}}[[FOO:@.+]](
109int foo(int n) {
110 int a = 0;
111 short aa = 0;
112 float b[10];
113 float bn[n];
114 double c[5][10];
115 double cn[5][n];
116 TT<long long, char> d;
117
Alexey Bataeva90fc662019-06-25 16:00:43 +0000118 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams_nowait(i64 -1, i8* @{{[^,]+}}, i32 3, i8** [[BP:%[^,]+]], i8** [[P:%[^,]+]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* [[SIZET]], i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* [[MAPT]], i32 0, i32 0), i32 {{[^,]+}}, i32 {{[^)]+}})
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000119 // CHECK-DAG: [[BP]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BPR:%[^,]+]], i32 0, i32 0
120 // CHECK-DAG: [[P]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PR:%[^,]+]], i32 0, i32 0
121 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BPR]], i32 0, i32 [[IDX0:[0-9]+]]
122 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PR]], i32 0, i32 [[IDX0]]
123 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
124 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
125 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR0]]
126 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR0]]
127 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BPR]], i32 0, i32 [[IDX1:[0-9]+]]
128 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PR]], i32 0, i32 [[IDX1]]
129 // CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
130 // CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
131 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR1]]
132 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR1]]
133 // CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BPR]], i32 0, i32 [[IDX1:[0-9]+]]
134 // CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PR]], i32 0, i32 [[IDX1]]
135 // CHECK-DAG: [[CBPADDR2:%.+]] = bitcast i8** [[BPADDR2]] to i[[SZ]]*
136 // CHECK-DAG: [[CPADDR2:%.+]] = bitcast i8** [[PADDR2]] to i[[SZ]]*
137 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR2]]
138 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR2]]
139 // CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
140 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
141 // CHECK: [[FAIL]]
142 // CHECK: call void [[HVT0:@.+]](i[[SZ]] {{[^,]+}}, i[[SZ]] {{[^,]+}}, i[[SZ]] {{[^)]+}})
143 // CHECK-NEXT: br label %[[END]]
144 // CHECK: [[END]]
Alexey Bataeva9f77c62017-12-13 21:04:20 +0000145 #pragma omp target teams distribute num_teams(a) thread_limit(a) firstprivate(aa) nowait
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000146 for (int i = 0; i < 10; ++i) {
147 }
148
149 // CHECK: call void [[HVT1:@.+]](i[[SZ]] {{[^,]+}})
150 #pragma omp target teams distribute if(target: 0)
151 for (int i = 0; i < 10; ++i) {
152 a += 1;
153 }
154
Alexey Bataeva90fc662019-06-25 16:00:43 +0000155 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 1, i8** [[BP:%[^,]+]], i8** [[P:%[^,]+]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* [[SIZET2]], i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* [[MAPT2]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000156 // CHECK-DAG: [[BP]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BPR:%[^,]+]], i32 0, i32 0
157 // CHECK-DAG: [[P]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PR:%[^,]+]], i32 0, i32 0
158 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BPR]], i32 0, i32 [[IDX0:[0-9]+]]
159 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PR]], i32 0, i32 [[IDX0]]
160 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
161 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
162 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR0]]
163 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR0]]
164
165 // CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
166 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
167 // CHECK: [[FAIL]]
168 // CHECK: call void [[HVT2:@.+]](i[[SZ]] {{[^,]+}})
169 // CHECK-NEXT: br label %[[END]]
170 // CHECK: [[END]]
171 #pragma omp target teams distribute if(target: 1)
172 for (int i = 0; i < 10; ++i) {
173 aa += 1;
174 }
175
176 // CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 10
177 // CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
178 // CHECK: [[IFTHEN]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000179 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 2, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[SIZET3]], i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[MAPT3]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000180 // CHECK-DAG: [[BPR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP:%[^,]+]], i32 0, i32 0
181 // CHECK-DAG: [[PR]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P:%[^,]+]], i32 0, i32 0
182
183 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 0
184 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 0
185 // CHECK-DAG: [[CBPADDR0:%.+]] = bitcast i8** [[BPADDR0]] to i[[SZ]]*
186 // CHECK-DAG: [[CPADDR0:%.+]] = bitcast i8** [[PADDR0]] to i[[SZ]]*
187 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR0]]
188 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR0]]
189
190 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 1
191 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[P]], i32 0, i32 1
192 // CHECK-DAG: [[CBPADDR1:%.+]] = bitcast i8** [[BPADDR1]] to i[[SZ]]*
193 // CHECK-DAG: [[CPADDR1:%.+]] = bitcast i8** [[PADDR1]] to i[[SZ]]*
194 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR1]]
195 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR1]]
196 // CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
197 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
198 // CHECK: [[FAIL]]
199 // CHECK: call void [[HVT3:@.+]]({{[^,]+}}, {{[^,]+}})
200 // CHECK-NEXT: br label %[[END]]
201 // CHECK: [[END]]
202 // CHECK-NEXT: br label %[[IFEND:.+]]
203 // CHECK: [[IFELSE]]
204 // CHECK: call void [[HVT3]]({{[^,]+}}, {{[^,]+}})
205 // CHECK-NEXT: br label %[[IFEND]]
206 // CHECK: [[IFEND]]
207 #pragma omp target teams distribute if(target: n>10)
208 for (int i = 0; i < 10; ++i) {
209 a += 1;
210 aa += 1;
211 }
212
213 // We capture 3 VLA sizes in this target region
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000214 // CHECK: load i32, i32* %
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000215 // CHECK-64: [[A_VAL:%.+]] = load i32, i32* %{{.+}},
216 // CHECK-64: [[A_ADDR:%.+]] = bitcast i[[SZ]]* [[A_CADDR:%.+]] to i32*
217 // CHECK-64: store i32 [[A_VAL]], i32* [[A_ADDR]],
218 // CHECK-64: [[A_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[A_CADDR]],
219
220 // CHECK-32: [[A_VAL:%.+]] = load i32, i32* %{{.+}},
221 // CHECK-32: store i32 [[A_VAL]], i32* [[A_CADDR:%.+]],
222 // CHECK-32: [[A_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[A_CADDR]],
223
Alexey Bataev8451efa2018-01-15 19:06:12 +0000224 // CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 20
225 // CHECK: br i1 [[IF]], label %[[TRY:[^,]+]], label %[[FAIL:[^,]+]]
226 // CHECK: [[TRY]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000227 // CHECK-64: [[BNSIZE:%.+]] = mul nuw i64 [[VLA0:%.+]], 4
228 // CHECK-32: [[BNSZSIZE:%.+]] = mul nuw i32 [[VLA0:%.+]], 4
229 // CHECK-32: [[BNSIZE:%.+]] = sext i32 [[BNSZSIZE]] to i64
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000230 // CHECK: [[CNELEMSIZE2:%.+]] = mul nuw i[[SZ]] 5, [[VLA1:%.+]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000231 // CHECK-64: [[CNSIZE:%.+]] = mul nuw i64 [[CNELEMSIZE2]], 8
232 // CHECK-32: [[CNSZSIZE:%.+]] = mul nuw i32 [[CNELEMSIZE2]], 8
233 // CHECK-32: [[CNSIZE:%.+]] = sext i32 [[CNSZSIZE]] to i64
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000234
Alexey Bataeva90fc662019-06-25 16:00:43 +0000235 // CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 10, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* [[SR:%[^,]+]], i64* getelementptr inbounds ([10 x i64], [10 x i64]* [[MAPT4]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000236 // CHECK-DAG: [[BPR]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP:%[^,]+]], i32 0, i32 0
237 // CHECK-DAG: [[PR]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P:%[^,]+]], i32 0, i32 0
Alexey Bataeva90fc662019-06-25 16:00:43 +0000238 // CHECK-DAG: [[SR]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S:%[^,]+]], i32 0, i32 0
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000239
Alexey Bataeva90fc662019-06-25 16:00:43 +0000240 // CHECK-DAG: [[SADDR0:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX0:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000241 // CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX0]]
242 // CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX0]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000243 // CHECK-DAG: [[SADDR1:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX1:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000244 // CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX1]]
245 // CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX1]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000246 // CHECK-DAG: [[SADDR2:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX2:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000247 // CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX2]]
248 // CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX2]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000249 // CHECK-DAG: [[SADDR3:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX3:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000250 // CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX3]]
251 // CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX3]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000252 // CHECK-DAG: [[SADDR4:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX4:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000253 // CHECK-DAG: [[BPADDR4:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX4]]
254 // CHECK-DAG: [[PADDR4:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX4]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000255 // CHECK-DAG: [[SADDR5:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX5:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000256 // CHECK-DAG: [[BPADDR5:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX5]]
257 // CHECK-DAG: [[PADDR5:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX5]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000258 // CHECK-DAG: [[SADDR6:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX6:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000259 // CHECK-DAG: [[BPADDR6:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX6]]
260 // CHECK-DAG: [[PADDR6:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX6]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000261 // CHECK-DAG: [[SADDR7:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX7:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000262 // CHECK-DAG: [[BPADDR7:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX7]]
263 // CHECK-DAG: [[PADDR7:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX7]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000264 // CHECK-DAG: [[SADDR8:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX8:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000265 // CHECK-DAG: [[BPADDR8:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX8]]
266 // CHECK-DAG: [[PADDR8:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX8]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000267 // CHECK-DAG: [[SADDR9:%.+]] = getelementptr inbounds [10 x i64], [10 x i64]* [[S]], i32 0, i32 [[IDX9:[0-9]+]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000268 // CHECK-DAG: [[BPADDR9:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[BP]], i32 0, i32 [[IDX9]]
269 // CHECK-DAG: [[PADDR9:%.+]] = getelementptr inbounds [10 x i8*], [10 x i8*]* [[P]], i32 0, i32 [[IDX9]]
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000270
271 // The names below are not necessarily consistent with the names used for the
272 // addresses above as some are repeated.
273 // CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CBPADDR0:%.+]],
274 // CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CPADDR0:%.+]],
275 // CHECK-DAG: [[CBPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
276 // CHECK-DAG: [[CPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000277 // CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000278
279 // CHECK-DAG: store i[[SZ]] [[VLA1]], i[[SZ]]* [[CBPADDR1:%.+]],
280 // CHECK-DAG: store i[[SZ]] [[VLA1]], i[[SZ]]* [[CPADDR1:%.+]],
281 // CHECK-DAG: [[CBPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
282 // CHECK-DAG: [[CPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000283 // CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000284
285 // CHECK-DAG: store i[[SZ]] 5, i[[SZ]]* [[CBPADDR2:%.+]],
286 // CHECK-DAG: store i[[SZ]] 5, i[[SZ]]* [[CPADDR2:%.+]],
287 // CHECK-DAG: [[CBPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
288 // CHECK-DAG: [[CPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000289 // CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000290
291 // CHECK-DAG: store i[[SZ]] [[A_CVAL]], i[[SZ]]* [[CBPADDR3:%.+]],
292 // CHECK-DAG: store i[[SZ]] [[A_CVAL]], i[[SZ]]* [[CPADDR3:%.+]],
293 // CHECK-DAG: [[CBPADDR3]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
294 // CHECK-DAG: [[CPADDR3]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000295 // CHECK-DAG: store i64 4, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000296
297 // CHECK-DAG: store [10 x float]* %{{.+}}, [10 x float]** [[CBPADDR4:%.+]],
298 // CHECK-DAG: store [10 x float]* %{{.+}}, [10 x float]** [[CPADDR4:%.+]],
299 // CHECK-DAG: [[CBPADDR4]] = bitcast i8** {{%[^,]+}} to [10 x float]**
300 // CHECK-DAG: [[CPADDR4]] = bitcast i8** {{%[^,]+}} to [10 x float]**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000301 // CHECK-DAG: store i64 40, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000302
303 // CHECK-DAG: store float* %{{.+}}, float** [[CBPADDR5:%.+]],
304 // CHECK-DAG: store float* %{{.+}}, float** [[CPADDR5:%.+]],
305 // CHECK-DAG: [[CBPADDR5]] = bitcast i8** {{%[^,]+}} to float**
306 // CHECK-DAG: [[CPADDR5]] = bitcast i8** {{%[^,]+}} to float**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000307 // CHECK-DAG: store i64 [[BNSIZE]], i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000308
309 // CHECK-DAG: store [5 x [10 x double]]* %{{.+}}, [5 x [10 x double]]** [[CBPADDR6:%.+]],
310 // CHECK-DAG: store [5 x [10 x double]]* %{{.+}}, [5 x [10 x double]]** [[CPADDR6:%.+]],
311 // CHECK-DAG: [[CBPADDR6]] = bitcast i8** {{%[^,]+}} to [5 x [10 x double]]**
312 // CHECK-DAG: [[CPADDR6]] = bitcast i8** {{%[^,]+}} to [5 x [10 x double]]**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000313 // CHECK-DAG: store i64 400, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000314
315 // CHECK-DAG: store double* %{{.+}}, double** [[CBPADDR7:%.+]],
316 // CHECK-DAG: store double* %{{.+}}, double** [[CPADDR7:%.+]],
317 // CHECK-DAG: [[CBPADDR7]] = bitcast i8** {{%[^,]+}} to double**
318 // CHECK-DAG: [[CPADDR7]] = bitcast i8** {{%[^,]+}} to double**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000319 // CHECK-DAG: store i64 [[CNSIZE]], i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000320
321 // CHECK-DAG: store [[TT]]* %{{.+}}, [[TT]]** [[CBPADDR8:%.+]],
322 // CHECK-DAG: store [[TT]]* %{{.+}}, [[TT]]** [[CPADDR8:%.+]],
323 // CHECK-DAG: [[CBPADDR8]] = bitcast i8** {{%[^,]+}} to [[TT]]**
324 // CHECK-DAG: [[CPADDR8]] = bitcast i8** {{%[^,]+}} to [[TT]]**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000325 // CHECK-DAG: store i64 {{12|16}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000326
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000327 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CBPADDR9:%.+]],
328 // CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[CPADDR9:%.+]],
329 // CHECK-DAG: [[CBPADDR9]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
330 // CHECK-DAG: [[CPADDR9]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000331 // CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000332
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000333 // CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
334 // CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
335
336 // CHECK: [[FAIL]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000337 // CHECK: call void [[HVT4:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000338 // CHECK-NEXT: br label %[[END]]
339 // CHECK: [[END]]
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000340 #pragma omp target teams distribute if(target: n>20) dist_schedule(static, n)
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000341 for (int i = 0; i < 10; ++i) {
342 a += 1;
343 b[2] += 1.0;
344 bn[3] += 1.0;
345 c[1][2] += 1.0;
346 cn[1][3] += 1.0;
347 d.X += 1;
348 d.Y += 1;
349 }
350
351 return a;
352}
353
354// Check that the offloading functions are emitted and that the arguments are
355// correct and loaded correctly for the target regions in foo().
356
357// CHECK: define internal void [[HVT0]](i[[SZ]] {{[^,]+}}, i[[SZ]] {{[^,]+}}, i[[SZ]] {{[^)]+}})
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000358// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]])* [[OMP_OUTLINED:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] {{[^)]+}})
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000359//
360//
361// CHECK: define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] {{[^)]+}})
Alexey Bataev475a7442018-01-12 19:39:11 +0000362// CHECK: alloca i[[SZ]],
363// CHECK: bitcast i[[SZ]]* {{.+}} to i16*
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000364// CHECK: ret void
365// CHECK-NEXT: }
366
367
368// CHECK: define internal void [[HVT1]](i[[SZ]] %{{.+}})
369// Create stack storage and store argument in there.
370// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
371// CHECK: [[AA_CASTED:%.+]] = alloca i[[SZ]], align
372// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
373// CHECK-64: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i32*
374// CHECK-64: [[AA:%.+]] = load i32, i32* [[AA_CADDR]], align
375// CHECK-32: [[AA:%.+]] = load i32, i32* [[AA_ADDR]], align
376// CHECK-64: [[AA_C:%.+]] = bitcast i[[SZ]]* [[AA_CASTED]] to i32*
377// CHECK-64: store i32 [[AA]], i32* [[AA_C]], align
378// CHECK-32: store i32 [[AA]], i32* [[AA_CASTED]], align
379// CHECK: [[PARAM:%.+]] = load i[[SZ]], i[[SZ]]* [[AA_CASTED]], align
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000380// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]])* [[OMP_OUTLINED1:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[PARAM]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000381//
382//
383// CHECK: define internal {{.*}}void [[OMP_OUTLINED1]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}})
384// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
385// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
386// CHECK-64: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i32*
387// CHECK-64: [[AA:%.+]] = load i32, i32* [[AA_CADDR]], align
388// CHECK-32: [[AA:%.+]] = load i32, i32* [[AA_ADDR]], align
389// CHECK: ret void
390// CHECK-NEXT: }
391
392// CHECK: define internal void [[HVT2]](i[[SZ]] %{{.+}})
393// Create stack storage and store argument in there.
394// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
395// CHECK: [[AA_CASTED:%.+]] = alloca i[[SZ]], align
396// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
397// CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
398// CHECK: [[AA:%.+]] = load i16, i16* [[AA_CADDR]], align
399// CHECK: [[AA_C:%.+]] = bitcast i[[SZ]]* [[AA_CASTED]] to i16*
400// CHECK: store i16 [[AA]], i16* [[AA_C]], align
401// CHECK: [[PARAM:%.+]] = load i[[SZ]], i[[SZ]]* [[AA_CASTED]], align
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000402// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]])* [[OMP_OUTLINED2:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[PARAM]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000403//
404//
405// CHECK: define internal {{.*}}void [[OMP_OUTLINED2]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}})
406// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
407// CHECK: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
408// CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
409// CHECK: [[AA:%.+]] = load i16, i16* [[AA_CADDR]], align
410// CHECK: ret void
411// CHECK-NEXT: }
412
413// CHECK: define internal void [[HVT3]]
414// Create stack storage and store argument in there.
415// CHECK: [[A_ADDR:%.+]] = alloca i[[SZ]], align
416// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
417// CHECK: [[A_CASTED:%.+]] = alloca i[[SZ]], align
418// CHECK: [[AA_CASTED:%.+]] = alloca i[[SZ]], align
419// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[A_ADDR]], align
420// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
421// CHECK-64-DAG:[[A_CADDR:%.+]] = bitcast i[[SZ]]* [[A_ADDR]] to i32*
422// CHECK-DAG: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
423// CHECK-64-DAG:[[A:%.+]] = load i32, i32* [[A_CADDR]], align
424// CHECK-32-DAG:[[A:%.+]] = load i32, i32* [[A_ADDR]], align
425// CHECK-64-DAG:[[A_C:%.+]] = bitcast i[[SZ]]* [[A_CASTED]] to i32*
426// CHECK-64-DAG:store i32 [[A]], i32* [[A_C]], align
427// CHECK-32-DAG:store i32 [[A]], i32* [[A_CASTED]], align
428// CHECK-DAG: [[AA:%.+]] = load i16, i16* [[AA_CADDR]], align
429// CHECK-DAG: [[AA_C:%.+]] = bitcast i[[SZ]]* [[AA_CASTED]] to i16*
430// CHECK-DAG: store i16 [[AA]], i16* [[AA_C]], align
431// CHECK-DAG: [[PARAM1:%.+]] = load i[[SZ]], i[[SZ]]* [[A_CASTED]], align
432// CHECK-DAG: [[PARAM2:%.+]] = load i[[SZ]], i[[SZ]]* [[AA_CASTED]], align
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000433// CHECK-DAG: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]], i[[SZ]])* [[OMP_OUTLINED3:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[PARAM1]], i[[SZ]] [[PARAM2]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000434//
435//
436// CHECK: define internal {{.*}}void [[OMP_OUTLINED3]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}})
437// CHECK: [[A_ADDR:%.+]] = alloca i[[SZ]], align
438// CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]], align
439// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[A_ADDR]], align
440// CHECK-DAG: store i[[SZ]] %{{.+}}, i[[SZ]]* [[AA_ADDR]], align
441// CHECK-64-DAG:[[A_CADDR:%.+]] = bitcast i[[SZ]]* [[A_ADDR]] to i32*
442// CHECK-DAG: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
443// CHECK: ret void
444// CHECK-NEXT: }
445
446// CHECK: define internal void [[HVT4]]
447// Create local storage for each capture.
448// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
449// CHECK: [[LOCAL_B:%.+]] = alloca [10 x float]*
450// CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
451// CHECK: [[LOCAL_BN:%.+]] = alloca float*
452// CHECK: [[LOCAL_C:%.+]] = alloca [5 x [10 x double]]*
453// CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
454// CHECK: [[LOCAL_VLA3:%.+]] = alloca i[[SZ]]
455// CHECK: [[LOCAL_CN:%.+]] = alloca double*
456// CHECK: [[LOCAL_D:%.+]] = alloca [[TT]]*
Alexey Bataevfd9b2af2018-01-04 20:50:08 +0000457// CHECK: alloca i[[SZ]],
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000458// CHECK: [[LOCAL_A_CASTED:%.+]] = alloca i[[SZ]]
459// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
460// CHECK-DAG: store [10 x float]* [[ARG_B:%.+]], [10 x float]** [[LOCAL_B]]
461// CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
462// CHECK-DAG: store float* [[ARG_BN:%.+]], float** [[LOCAL_BN]]
463// CHECK-DAG: store [5 x [10 x double]]* [[ARG_C:%.+]], [5 x [10 x double]]** [[LOCAL_C]]
464// CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
465// CHECK-DAG: store i[[SZ]] [[ARG_VLA3:%.+]], i[[SZ]]* [[LOCAL_VLA3]]
466// CHECK-DAG: store double* [[ARG_CN:%.+]], double** [[LOCAL_CN]]
467// CHECK-DAG: store [[TT]]* [[ARG_D:%.+]], [[TT]]** [[LOCAL_D]]
468
469// CHECK-64-DAG:[[CONV_AP:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
470// CHECK-DAG: [[REF_B:%.+]] = load [10 x float]*, [10 x float]** [[LOCAL_B]],
471// CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
472// CHECK-DAG: [[REF_BN:%.+]] = load float*, float** [[LOCAL_BN]],
473// CHECK-DAG: [[REF_C:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[LOCAL_C]],
474// CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
475// CHECK-DAG: [[VAL_VLA3:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA3]],
476// CHECK-DAG: [[REF_CN:%.+]] = load double*, double** [[LOCAL_CN]],
477// CHECK-DAG: [[REF_D:%.+]] = load [[TT]]*, [[TT]]** [[LOCAL_D]],
478
479// CHECK-64-DAG:[[CONV_A:%.+]] = load i32, i32* [[CONV_AP]]
480// CHECK-64-DAG:[[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_A_CASTED]] to i32*
481// CHECK-64-DAG:store i32 [[CONV_A]], i32* [[CONV]], align
482// CHECK-32-DAG:[[LOCAL_AV:%.+]] = load i32, i32* [[LOCAL_A]]
483// CHECK-32-DAG:store i32 [[LOCAL_AV]], i32* [[LOCAL_A_CASTED]], align
484// CHECK-DAG: [[REF_A:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_A_CASTED]],
485
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000486// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 10, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]], [10 x float]*, i[[SZ]], float*, [5 x [10 x double]]*, i[[SZ]], i[[SZ]], double*, [[TT]]*, i[[SZ]])* [[OMP_OUTLINED4:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[REF_A]], [10 x float]* [[REF_B]], i[[SZ]] [[VAL_VLA1]], float* [[REF_BN]], [5 x [10 x double]]* [[REF_C]], i[[SZ]] [[VAL_VLA2]], i[[SZ]] [[VAL_VLA3]], double* [[REF_CN]], [[TT]]* [[REF_D]], i[[SZ]] %{{.+}})
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000487//
488//
489// CHECK: define internal {{.*}}void [[OMP_OUTLINED4]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}}, [10 x float]* {{.+}}, i[[SZ]] %{{.+}}, float* {{.+}}, [5 x [10 x double]]* {{.+}}, i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, double* {{.+}}, [[TT]]* {{.+}})
490// To reduce complexity, we're only going as far as validating the signature of the outlined parallel function.
491
492template<typename tx>
493tx ftemplate(int n) {
494 tx a = 0;
495 short aa = 0;
496 tx b[10];
497
498 #pragma omp target teams distribute if(target: n>40)
499 for (int i = 0; i < 10; ++i) {
500 a += 1;
501 aa += 1;
502 b[2] += 1;
503 }
504
505 return a;
506}
507
508static
509int fstatic(int n) {
510 int a = 0;
511 short aa = 0;
512 char aaa = 0;
513 int b[10];
514
515 #pragma omp target teams distribute if(target: n>50)
516 for (int i = a; i < n; ++i) {
517 a += 1;
518 aa += 1;
519 aaa += 1;
520 b[2] += 1;
521 }
522
523 return a;
524}
525
526struct S1 {
527 double a;
528
529 int r1(int n){
530 int b = n+1;
531 short int c[2][n];
532
533 #pragma omp target teams distribute if(target: n>60)
534 for (int i = 0; i < 10; ++i) {
535 this->a = (double)b + 1.5;
536 c[1][1] = ++a;
537 }
538
539 return c[1][1] + (int)b;
540 }
541};
542
543// CHECK: define {{.*}}@{{.*}}bar{{.*}}
544int bar(int n){
545 int a = 0;
546
547 // CHECK: call {{.*}}i32 [[FOO]](i32 {{.*}})
548 a += foo(n);
549
550 S1 S;
551 // CHECK: call {{.*}}i32 [[FS1:@.+]]([[S1]]* {{.*}}, i32 {{.*}})
552 a += S.r1(n);
553
554 // CHECK: call {{.*}}i32 [[FSTATIC:@.+]](i32 {{.*}})
555 a += fstatic(n);
556
557 // CHECK: call {{.*}}i32 [[FTEMPLATE:@.+]](i32 {{.*}})
558 a += ftemplate<int>(n);
559
560 return a;
561}
562
563//
564// CHECK: define {{.*}}[[FS1]]
565//
566// CHECK: i8* @llvm.stacksave()
567// CHECK-64: [[B_ADDR:%.+]] = bitcast i[[SZ]]* [[B_CADDR:%.+]] to i32*
568// CHECK-64: store i32 %{{.+}}, i32* [[B_ADDR]],
569// CHECK-64: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_CADDR]],
570
Sander de Smalen9084a3b2018-02-13 07:49:34 +0000571// CHECK-32: store i32 %{{.+}}, i32* %__vla_expr
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000572// CHECK-32: store i32 %{{.+}}, i32* [[B_ADDR:%.+]],
573// CHECK-32: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_ADDR]],
574
Alexey Bataev8451efa2018-01-15 19:06:12 +0000575// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 60
576// CHECK: br i1 [[IF]], label %[[TRY:[^,]+]], label %[[FAIL:[^,]+]]
577// CHECK: [[TRY]]
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000578// We capture 2 VLA sizes in this target region
579// CHECK: [[CELEMSIZE2:%.+]] = mul nuw i[[SZ]] 2, [[VLA0:%.+]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000580// CHECK-64: [[CSIZE:%.+]] = mul nuw i[[SZ]] [[CELEMSIZE2]], 2
581// CHECK-32: [[CSSZSIZE:%.+]] = mul nuw i[[SZ]] [[CELEMSIZE2]], 2
582// CHECK-32: [[CSIZE:%.+]] = sext i32 [[CSSZSIZE]] to i64
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000583
Alexey Bataeva90fc662019-06-25 16:00:43 +0000584// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 6, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* [[SR:%[^,]+]], i64* getelementptr inbounds ([6 x i64], [6 x i64]* [[MAPT5]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevb3638132018-07-19 16:34:13 +0000585// CHECK-DAG: [[BPR]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP:%.+]], i32 0, i32 0
586// CHECK-DAG: [[PR]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P:%.+]], i32 0, i32 0
Alexey Bataeva90fc662019-06-25 16:00:43 +0000587// CHECK-DAG: [[SR]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S:%.+]], i32 0, i32 0
588// CHECK-DAG: [[SADDR0:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX0:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000589// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX0]]
590// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX0]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000591// CHECK-DAG: [[SADDR1:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX1:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000592// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX1]]
593// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX1]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000594// CHECK-DAG: [[SADDR2:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX2:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000595// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX2]]
596// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX2]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000597// CHECK-DAG: [[SADDR3:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX3:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000598// CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX3]]
599// CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX3]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000600// CHECK-DAG: [[SADDR4:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX3:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000601// CHECK-DAG: [[BPADDR4:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX3]]
602// CHECK-DAG: [[PADDR4:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX3]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000603// CHECK-DAG: [[SADDR5:%.+]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S]], i32 [[IDX3:[0-9]+]]
Alexey Bataevb3638132018-07-19 16:34:13 +0000604// CHECK-DAG: [[BPADDR5:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP]], i32 [[IDX3]]
605// CHECK-DAG: [[PADDR5:%.+]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P]], i32 [[IDX3]]
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000606
607// The names below are not necessarily consistent with the names used for the
608// addresses above as some are repeated.
609// CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CBPADDR0:%.+]],
610// CHECK-DAG: store i[[SZ]] [[VLA0]], i[[SZ]]* [[CPADDR0:%.+]],
611// CHECK-DAG: [[CBPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
612// CHECK-DAG: [[CPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000613// CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000614
615// CHECK-DAG: store i[[SZ]] 2, i[[SZ]]* [[CBPADDR1:%.+]],
616// CHECK-DAG: store i[[SZ]] 2, i[[SZ]]* [[CPADDR1:%.+]],
617// CHECK-DAG: [[CBPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
618// CHECK-DAG: [[CPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000619// CHECK-DAG: store i64 {{4|8}}, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000620
621// CHECK-DAG: store i[[SZ]] [[B_CVAL]], i[[SZ]]* [[CBPADDR2:%.+]],
622// CHECK-DAG: store i[[SZ]] [[B_CVAL]], i[[SZ]]* [[CPADDR2:%.+]],
623// CHECK-DAG: [[CBPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
624// CHECK-DAG: [[CPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
Alexey Bataeva90fc662019-06-25 16:00:43 +0000625// CHECK-DAG: store i64 4, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000626
627// CHECK-DAG: store [[S1]]* %{{.+}}, [[S1]]** [[CBPADDR3:%.+]],
Alexey Bataevb3638132018-07-19 16:34:13 +0000628// CHECK-DAG: store double* %{{.+}}, double** [[CPADDR3:%.+]],
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000629// CHECK-DAG: [[CBPADDR3]] = bitcast i8** {{%[^,]+}} to [[S1]]**
Alexey Bataevb3638132018-07-19 16:34:13 +0000630// CHECK-DAG: [[CPADDR3]] = bitcast i8** {{%[^,]+}} to double**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000631// CHECK-DAG: store i64 8, i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000632
Alexey Bataevb3638132018-07-19 16:34:13 +0000633// CHECK-DAG: store [[S1]]* %{{.+}}, [[S1]]** [[CBPADDR4:%.+]],
634// CHECK-DAG: store double* %{{.+}}, double** [[CPADDR4:%.+]],
635// CHECK-DAG: [[CBPADDR4]] = bitcast i8** {{%[^,]+}} to [[S1]]**
636// CHECK-DAG: [[CPADDR4]] = bitcast i8** {{%[^,]+}} to double**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000637// CHECK-DAG: store i64 8, i64* {{%[^,]+}}
Alexey Bataevb3638132018-07-19 16:34:13 +0000638
639// CHECK-DAG: store i16* %{{.+}}, i16** [[CBPADDR5:%.+]],
640// CHECK-DAG: store i16* %{{.+}}, i16** [[CPADDR5:%.+]],
641// CHECK-DAG: [[CBPADDR5]] = bitcast i8** {{%[^,]+}} to i16**
642// CHECK-DAG: [[CPADDR5]] = bitcast i8** {{%[^,]+}} to i16**
Alexey Bataeva90fc662019-06-25 16:00:43 +0000643// CHECK-DAG: store i64 [[CSIZE]], i64* {{%[^,]+}}
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000644
645// CHECK-NEXT: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
646// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:[^,]+]], label %[[END:[^,]+]]
647
648// CHECK: [[FAIL]]
649// CHECK: call void [[HVT7:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
650// CHECK-NEXT: br label %[[END]]
651// CHECK: [[END]]
652
653//
654// CHECK: define {{.*}}[[FSTATIC]]
655//
656// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 50
657// CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
658// CHECK: [[IFTHEN]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000659// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 5, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[SIZET6]], i32 0, i32 0), i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPT6]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000660// CHECK-DAG: [[BPR]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP:%.+]], i32 0, i32 0
661// CHECK-DAG: [[PR]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P:%.+]], i32 0, i32 0
662
663// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 0
664// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 0
665// CHECK-DAG: store i[[SZ]] [[VAL0:%.+]], i[[SZ]]* [[CBPADDR0:%.+]],
666// CHECK-DAG: store i[[SZ]] [[VAL0]], i[[SZ]]* [[CPADDR0:%.+]],
667// CHECK-DAG: [[CBPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
668// CHECK-DAG: [[CPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
669
670// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 1
671// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 1
672// CHECK-DAG: store i[[SZ]] [[VAL1:%.+]], i[[SZ]]* [[CBPADDR1:%.+]],
673// CHECK-DAG: store i[[SZ]] [[VAL1]], i[[SZ]]* [[CPADDR1:%.+]],
674// CHECK-DAG: [[CBPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
675// CHECK-DAG: [[CPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
676
677// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 2
678// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 2
679// CHECK-DAG: store i[[SZ]] [[VAL2:%.+]], i[[SZ]]* [[CBPADDR2:%.+]],
680// CHECK-DAG: store i[[SZ]] [[VAL2]], i[[SZ]]* [[CPADDR2:%.+]],
681// CHECK-DAG: [[CBPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
682// CHECK-DAG: [[CPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
683
684// CHECK-DAG: [[BPADDR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 3
685// CHECK-DAG: [[PADDR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 3
686// CHECK-DAG: store i[[SZ]] [[VAL3:%.+]], i[[SZ]]* [[CBPADDR3:%.+]],
687// CHECK-DAG: store i[[SZ]] [[VAL3]], i[[SZ]]* [[CPADDR3:%.+]],
688// CHECK-DAG: [[CBPADDR3]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
689// CHECK-DAG: [[CPADDR3]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
690
691// CHECK-DAG: [[BPADDR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BP]], i32 0, i32 4
692// CHECK-DAG: [[PADDR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[P]], i32 0, i32 4
693// CHECK-DAG: store [10 x i32]* %{{.+}}, [10 x i32]** [[CBPADDR4:%.+]],
694// CHECK-DAG: store [10 x i32]* %{{.+}}, [10 x i32]** [[CPADDR4:%.+]],
695// CHECK-DAG: [[CBPADDR4]] = bitcast i8** {{%[^,]+}} to [10 x i32]**
696// CHECK-DAG: [[CPADDR4]] = bitcast i8** {{%[^,]+}} to [10 x i32]**
697
698// CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
699// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
700// CHECK: [[FAIL]]
701// CHECK: call void [[HVT6:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
702// CHECK-NEXT: br label %[[END]]
703// CHECK: [[END]]
704// CHECK-NEXT: br label %[[IFEND:.+]]
705// CHECK: [[IFELSE]]
706// CHECK: call void [[HVT6]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}}, {{[^,]+}})
707// CHECK-NEXT: br label %[[IFEND]]
708// CHECK: [[IFEND]]
709
710//
711// CHECK: define {{.*}}[[FTEMPLATE]]
712//
713// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 40
714// CHECK: br i1 [[IF]], label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
715// CHECK: [[IFTHEN]]
Alexey Bataeva90fc662019-06-25 16:00:43 +0000716// CHECK-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 3, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* [[SIZET7]], i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* [[MAPT7]], i32 0, i32 0), i32 0, i32 0)
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000717// CHECK-DAG: [[BPR]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP:%.+]], i32 0, i32 0
718// CHECK-DAG: [[PR]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P:%.+]], i32 0, i32 0
719
720// CHECK-DAG: [[BPADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 0
721// CHECK-DAG: [[PADDR0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 0
722// CHECK-DAG: store i[[SZ]] [[VAL0:%.+]], i[[SZ]]* [[CBPADDR0:%.+]],
723// CHECK-DAG: store i[[SZ]] [[VAL0]], i[[SZ]]* [[CPADDR0:%.+]],
724// CHECK-DAG: [[CBPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
725// CHECK-DAG: [[CPADDR0]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
726
727// CHECK-DAG: [[BPADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 1
728// CHECK-DAG: [[PADDR1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 1
729// CHECK-DAG: store i[[SZ]] [[VAL1:%.+]], i[[SZ]]* [[CBPADDR1:%.+]],
730// CHECK-DAG: store i[[SZ]] [[VAL1]], i[[SZ]]* [[CPADDR1:%.+]],
731// CHECK-DAG: [[CBPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
732// CHECK-DAG: [[CPADDR1]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
733
734// CHECK-DAG: [[BPADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BP]], i32 0, i32 2
735// CHECK-DAG: [[PADDR2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[P]], i32 0, i32 2
736// CHECK-DAG: store i[[SZ]] [[VAL2:%.+]], i[[SZ]]* [[CBPADDR2:%.+]],
737// CHECK-DAG: store i[[SZ]] [[VAL2]], i[[SZ]]* [[CPADDR2:%.+]],
738// CHECK-DAG: [[CBPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
739// CHECK-DAG: [[CPADDR2]] = bitcast i8** {{%[^,]+}} to i[[SZ]]*
740
741// CHECK: [[ERROR:%.+]] = icmp ne i32 [[RET]], 0
742// CHECK-NEXT: br i1 [[ERROR]], label %[[FAIL:.+]], label %[[END:[^,]+]]
743// CHECK: [[FAIL]]
744// CHECK: call void [[HVT5:@.+]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}})
745// CHECK-NEXT: br label %[[END]]
746// CHECK: [[END]]
747// CHECK-NEXT: br label %[[IFEND:.+]]
748// CHECK: [[IFELSE]]
749// CHECK: call void [[HVT5]]({{[^,]+}}, {{[^,]+}}, {{[^,]+}})
750// CHECK-NEXT: br label %[[IFEND]]
751// CHECK: [[IFEND]]
752
753
754
755// Check that the offloading functions are emitted and that the arguments are
756// correct and loaded correctly for the target regions of the callees of bar().
757
758// CHECK: define internal void [[HVT7]]
759// Create local storage for each capture.
760// CHECK: [[LOCAL_THIS:%.+]] = alloca [[S1]]*
761// CHECK: [[LOCAL_B:%.+]] = alloca i[[SZ]]
762// CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
763// CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
764// CHECK: [[LOCAL_C:%.+]] = alloca i16*
765// CHECK: [[LOCAL_B_CASTED:%.+]] = alloca i[[SZ]]
766// CHECK-DAG: store [[S1]]* [[ARG_THIS:%.+]], [[S1]]** [[LOCAL_THIS]]
767// CHECK-DAG: store i[[SZ]] [[ARG_B:%.+]], i[[SZ]]* [[LOCAL_B]]
768// CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
769// CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
770// CHECK-DAG: store i16* [[ARG_C:%.+]], i16** [[LOCAL_C]]
771// Store captures in the context.
772// CHECK-DAG: [[REF_THIS:%.+]] = load [[S1]]*, [[S1]]** [[LOCAL_THIS]],
773// CHECK-64-DAG:[[CONV_BP:%.+]] = bitcast i[[SZ]]* [[LOCAL_B]] to i32*
774// CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
775// CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
776// CHECK-DAG: [[REF_C:%.+]] = load i16*, i16** [[LOCAL_C]],
777
778// CHECK-64-DAG:[[CONV_B:%.+]] = load i32, i32* [[CONV_BP]]
779// CHECK-64-DAG:[[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_B_CASTED]] to i32*
780// CHECK-64-DAG:store i32 [[CONV_B]], i32* [[CONV]], align
781// CHECK-32-DAG:[[LOCAL_BV:%.+]] = load i32, i32* [[LOCAL_B]]
782// CHECK-32-DAG:store i32 [[LOCAL_BV]], i32* [[LOCAL_B_CASTED]], align
783// CHECK-DAG: [[REF_B:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_B_CASTED]],
784
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000785// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [[S1]]*, i[[SZ]], i[[SZ]], i[[SZ]], i16*)* [[OMP_OUTLINED5:@.+]] to void (i32*, i32*, ...)*), [[S1]]* [[REF_THIS]], i[[SZ]] [[REF_B]], i[[SZ]] [[VAL_VLA1]], i[[SZ]] [[VAL_VLA2]], i16* [[REF_C]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000786//
787//
788// CHECK: define internal {{.*}}void [[OMP_OUTLINED5]](i32* noalias %.global_tid., i32* noalias %.bound_tid., [[S1]]* %{{.+}}, i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, i16* {{.+}})
789// To reduce complexity, we're only going as far as validating the signature of the outlined parallel function.
790
791
792// CHECK: define internal void [[HVT6]]
793// Create local storage for each capture.
794// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
795// CHECK: alloca i[[SZ]],
796// CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
797// CHECK: [[LOCAL_AAA:%.+]] = alloca i[[SZ]]
798// CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
799// CHECK: [[LOCAL_A_CASTED:%.+]] = alloca i[[SZ]]
800// CHECK: alloca i[[SZ]],
801// CHECK: [[LOCAL_AA_CASTED:%.+]] = alloca i[[SZ]]
802// CHECK: [[LOCAL_AAA_CASTED:%.+]] = alloca i[[SZ]]
803// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
804// CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
805// CHECK-DAG: store i[[SZ]] [[ARG_AAA:%.+]], i[[SZ]]* [[LOCAL_AAA]]
806// CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
807// Store captures in the context.
808// CHECK-64-DAG:[[CONV_AP:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
809// CHECK-DAG: [[CONV_AAP:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
810// CHECK-DAG: [[CONV_AAAP:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA]] to i8*
811// CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
812
813// CHECK-64-DAG:[[CONV_A:%.+]] = load i32, i32* [[CONV_AP]]
814// CHECK-64-DAG:[[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_A_CASTED]] to i32*
815// CHECK-64-DAG:store i32 [[CONV_A]], i32* [[CONV]], align
816// CHECK-32-DAG:[[LOCAL_AV:%.+]] = load i32, i32* [[LOCAL_A]]
817// CHECK-32-DAG:store i32 [[LOCAL_AV]], i32* [[LOCAL_A_CASTED]], align
818// CHECK-DAG: [[REF_A:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_A_CASTED]],
819
820// CHECK-DAG: [[CONV_AA:%.+]] = load i16, i16* [[CONV_AAP]]
821// CHECK-DAG: [[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA_CASTED]] to i16*
822// CHECK-DAG: store i16 [[CONV_AA]], i16* [[CONV]], align
823// CHECK-DAG: [[REF_AA:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_AA_CASTED]],
824
825// CHECK-DAG: [[CONV_AAA:%.+]] = load i8, i8* [[CONV_AAAP]]
826// CHECK-DAG: [[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA_CASTED]] to i8*
827// CHECK-DAG: store i8 [[CONV_AAA]], i8* [[CONV]], align
828// CHECK-DAG: [[REF_AAA:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_AAA_CASTED]],
829
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000830// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]], i[[SZ]], i[[SZ]], i[[SZ]], [10 x i32]*)* [[OMP_OUTLINED6:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[REF_A]], i[[SZ]] {{.+}}, i[[SZ]] [[REF_AA]], i[[SZ]] [[REF_AAA]], [10 x i32]* [[REF_B]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000831//
832//
833// CHECK: define internal {{.*}}void [[OMP_OUTLINED6]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, [10 x i32]* {{.+}})
834// To reduce complexity, we're only going as far as validating the signature of the outlined parallel function.
835
836// CHECK: define internal void [[HVT5]]
837// Create local storage for each capture.
838// CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
839// CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
840// CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
841// CHECK: [[LOCAL_A_CASTED:%.+]] = alloca i[[SZ]]
842// CHECK: [[LOCAL_AA_CASTED:%.+]] = alloca i[[SZ]]
843// CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
844// CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
845// CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
846// Store captures in the context.
847// CHECK-64-DAG:[[CONV_AP:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
848// CHECK-DAG: [[CONV_AAP:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
849// CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
850
851// CHECK-64-DAG:[[CONV_A:%.+]] = load i32, i32* [[CONV_AP]]
852// CHECK-64-DAG:[[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_A_CASTED]] to i32*
853// CHECK-64-DAG:store i32 [[CONV_A]], i32* [[CONV]], align
854// CHECK-32-DAG:[[LOCAL_AV:%.+]] = load i32, i32* [[LOCAL_A]]
855// CHECK-32-DAG:store i32 [[LOCAL_AV]], i32* [[LOCAL_A_CASTED]], align
856// CHECK-DAG: [[REF_A:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_A_CASTED]],
857
858// CHECK-DAG: [[CONV_AA:%.+]] = load i16, i16* [[CONV_AAP]]
859// CHECK-DAG: [[CONV:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA_CASTED]] to i16*
860// CHECK-DAG: store i16 [[CONV_AA]], i16* [[CONV]], align
861// CHECK-DAG: [[REF_AA:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_AA_CASTED]],
862
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000863// CHECK: call {{.*}}void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* [[DEF_LOC]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i[[SZ]], i[[SZ]], [10 x i32]*)* [[OMP_OUTLINED7:@.+]] to void (i32*, i32*, ...)*), i[[SZ]] [[REF_A]], i[[SZ]] [[REF_AA]], [10 x i32]* [[REF_B]])
Alexey Bataevdfa430f2017-12-08 15:03:50 +0000864//
865//
866// CHECK: define internal {{.*}}void [[OMP_OUTLINED7]](i32* noalias %.global_tid., i32* noalias %.bound_tid., i[[SZ]] %{{.+}}, i[[SZ]] %{{.+}}, [10 x i32]* {{.+}})
867// To reduce complexity, we're only going as far as validating the signature of the outlined parallel function.
868
869#endif