blob: 51663d0feb220adfb72b73c2bc2679fb4bb8db47 [file] [log] [blame]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +00002// Test host codegen.
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003// 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 %s --check-prefix=CHECK1
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +00004// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005// 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 %s --check-prefix=CHECK2
6// 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 %s --check-prefix=CHECK3
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +00007// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07008// 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 %s --check-prefix=CHECK4
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +00009
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050010// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000011// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050012// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
13// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000014// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050015// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000016
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070019// 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 %s --check-prefix=CHECK9
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070021// 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 %s --check-prefix=CHECK10
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070023// 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 %s --check-prefix=CHECK11
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070025// 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 %s --check-prefix=CHECK12
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050028// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050030// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050032// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050034// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000035
Saiyedul Islameaa341f2020-08-13 07:27:15 +000036// Test host codegen.
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070037// 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=CHECK17
Saiyedul Islameaa341f2020-08-13 07:27:15 +000038// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070039// 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=CHECK18
40// 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=CHECK19
Saiyedul Islameaa341f2020-08-13 07:27:15 +000041// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070042// 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=CHECK20
Saiyedul Islameaa341f2020-08-13 07:27:15 +000043
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050044// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000045// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050046// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
47// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000048// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050049// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000050
51// Test target codegen - host bc file has to be created first.
52// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070053// 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=CHECK25
Saiyedul Islameaa341f2020-08-13 07:27:15 +000054// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070055// 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=CHECK26
Saiyedul Islameaa341f2020-08-13 07:27:15 +000056// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070057// 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=CHECK27
Saiyedul Islameaa341f2020-08-13 07:27:15 +000058// 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
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070059// 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=CHECK28
Saiyedul Islameaa341f2020-08-13 07:27:15 +000060
61// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050062// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000063// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050064// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000065// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050066// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000067// 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
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050068// 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 %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000069
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000070// expected-no-diagnostics
71#ifndef HEADER
72#define HEADER
73
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000074
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000075
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000076
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000077// We have 6 target regions
78
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000079
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000080
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000081// Check target registration is registered as a Ctor.
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +000082
83
84template<typename tx>
85tx ftemplate(int n) {
86 tx a = 0;
87
88 #pragma omp target teams thread_limit(tx(20))
89 {
90 }
91
92 short b = 1;
93 #pragma omp target teams num_teams(b) thread_limit(1024)
94 {
95 a += b;
96 }
97
98 return a;
99}
100
101static
102int fstatic(int n) {
103
104 #pragma omp target teams num_teams(n) thread_limit(n*32)
105 {
106 }
107
108 #pragma omp target teams thread_limit(32+n)
109 {
110 }
111
112 return n+1;
113}
114
115struct S1 {
116 double a;
117
118 int r1(int n){
119 int b = 1;
120
121 #pragma omp target teams thread_limit(n-b)
122 {
123 this->a = (double)b + 1.5;
124 }
125
126 #pragma omp target teams thread_limit(1024)
127 {
128 this->a = 2.5;
129 }
130
131 return (int)a;
132 }
133};
134
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000135int bar(int n){
136 int a = 0;
137
138 S1 S;
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000139 a += S.r1(n);
140
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000141 a += fstatic(n);
142
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000143 a += ftemplate<int>(n);
144
145 return a;
146}
147
148
149
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000150
151
152
153
154
155
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000156
157
158
159
160
161
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000162
163
164
165
166
167
168// Check that the offloading functions are emitted and that the parallel function
169// is appropriately guarded.
170
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000171
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000172
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000173
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000174
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000175
Arpith Chacko Jacob7ecc0b72017-01-25 11:44:35 +0000176#endif
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700177// CHECK1-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900178// CHECK1-SAME: (i32 signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700179// CHECK1-NEXT: entry:
180// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
181// CHECK1-NEXT: [[A:%.*]] = alloca i32, align 4
182// CHECK1-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 8
183// CHECK1-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
184// CHECK1-NEXT: store i32 0, i32* [[A]], align 4
185// CHECK1-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900186// CHECK1-NEXT: [[CALL:%.*]] = call signext i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 8 dereferenceable(8) [[S]], i32 signext [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700187// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
188// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
189// CHECK1-NEXT: store i32 [[ADD]], i32* [[A]], align 4
190// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900191// CHECK1-NEXT: [[CALL1:%.*]] = call signext i32 @_ZL7fstatici(i32 signext [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700192// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
193// CHECK1-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
194// CHECK1-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
195// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900196// CHECK1-NEXT: [[CALL3:%.*]] = call signext i32 @_Z9ftemplateIiET_i(i32 signext [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700197// CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
198// CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
199// CHECK1-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
200// CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
201// CHECK1-NEXT: ret i32 [[TMP6]]
202//
203//
204// CHECK1-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900205// CHECK1-SAME: (%struct.S1* nonnull align 8 dereferenceable(8) [[THIS:%.*]], i32 signext [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700206// CHECK1-NEXT: entry:
207// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
208// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
209// CHECK1-NEXT: [[B:%.*]] = alloca i32, align 4
210// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
211// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
212// CHECK1-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
213// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
214// CHECK1-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
215// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
216// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [1 x i8*], align 8
217// CHECK1-NEXT: [[DOTOFFLOAD_PTRS5:%.*]] = alloca [1 x i8*], align 8
218// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [1 x i8*], align 8
219// CHECK1-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
220// CHECK1-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
221// CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
222// CHECK1-NEXT: store i32 1, i32* [[B]], align 4
223// CHECK1-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
224// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
225// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
226// CHECK1-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
227// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
228// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[B_CASTED]] to i32*
229// CHECK1-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
230// CHECK1-NEXT: [[TMP3:%.*]] = load i64, i64* [[B_CASTED]], align 8
231// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
232// CHECK1-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
233// CHECK1-NEXT: store i32 [[TMP4]], i32* [[CONV2]], align 4
234// CHECK1-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
235// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
236// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
237// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
238// CHECK1-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 8
239// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
240// CHECK1-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
241// CHECK1-NEXT: store double* [[A]], double** [[TMP9]], align 8
242// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
243// CHECK1-NEXT: store i8* null, i8** [[TMP10]], align 8
244// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
245// CHECK1-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
246// CHECK1-NEXT: store i64 [[TMP3]], i64* [[TMP12]], align 8
247// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
248// CHECK1-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
249// CHECK1-NEXT: store i64 [[TMP3]], i64* [[TMP14]], align 8
250// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
251// CHECK1-NEXT: store i8* null, i8** [[TMP15]], align 8
252// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
253// CHECK1-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
254// CHECK1-NEXT: store i64 [[TMP5]], i64* [[TMP17]], align 8
255// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
256// CHECK1-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i64*
257// CHECK1-NEXT: store i64 [[TMP5]], i64* [[TMP19]], align 8
258// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
259// CHECK1-NEXT: store i8* null, i8** [[TMP20]], align 8
260// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
261// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
262// CHECK1-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
263// CHECK1-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
264// CHECK1-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
265// CHECK1-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
266// CHECK1: omp_offload.failed:
267// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2:[0-9]+]]
268// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT]]
269// CHECK1: omp_offload.cont:
270// CHECK1-NEXT: [[A3:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
271// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
272// CHECK1-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
273// CHECK1-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 8
274// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
275// CHECK1-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
276// CHECK1-NEXT: store double* [[A3]], double** [[TMP29]], align 8
277// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i64 0, i64 0
278// CHECK1-NEXT: store i8* null, i8** [[TMP30]], align 8
279// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
280// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
281// CHECK1-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
282// CHECK1-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
283// CHECK1-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
284// CHECK1: omp_offload.failed7:
285// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
286// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT8]]
287// CHECK1: omp_offload.cont8:
288// CHECK1-NEXT: [[A9:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
289// CHECK1-NEXT: [[TMP35:%.*]] = load double, double* [[A9]], align 8
290// CHECK1-NEXT: [[CONV10:%.*]] = fptosi double [[TMP35]] to i32
291// CHECK1-NEXT: ret i32 [[CONV10]]
292//
293//
294// CHECK1-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900295// CHECK1-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700296// CHECK1-NEXT: entry:
297// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
298// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
299// CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
300// CHECK1-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
301// CHECK1-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i64, align 8
302// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 8
303// CHECK1-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 8
304// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 8
305// CHECK1-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i32, align 4
306// CHECK1-NEXT: [[DOTCAPTURE_EXPR__CASTED5:%.*]] = alloca i64, align 8
307// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [1 x i8*], align 8
308// CHECK1-NEXT: [[DOTOFFLOAD_PTRS8:%.*]] = alloca [1 x i8*], align 8
309// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [1 x i8*], align 8
310// CHECK1-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
311// CHECK1-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
312// CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
313// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
314// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
315// CHECK1-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
316// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
317// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
318// CHECK1-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
319// CHECK1-NEXT: [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
320// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
321// CHECK1-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED2]] to i32*
322// CHECK1-NEXT: store i32 [[TMP4]], i32* [[CONV3]], align 4
323// CHECK1-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED2]], align 8
324// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
325// CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
326// CHECK1-NEXT: store i64 [[TMP3]], i64* [[TMP7]], align 8
327// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
328// CHECK1-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
329// CHECK1-NEXT: store i64 [[TMP3]], i64* [[TMP9]], align 8
330// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
331// CHECK1-NEXT: store i8* null, i8** [[TMP10]], align 8
332// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
333// CHECK1-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
334// CHECK1-NEXT: store i64 [[TMP5]], i64* [[TMP12]], align 8
335// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
336// CHECK1-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
337// CHECK1-NEXT: store i64 [[TMP5]], i64* [[TMP14]], align 8
338// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
339// CHECK1-NEXT: store i8* null, i8** [[TMP15]], align 8
340// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
341// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
342// CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
343// CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
344// CHECK1-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
345// CHECK1-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
346// CHECK1-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
347// CHECK1: omp_offload.failed:
348// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2]]
349// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT]]
350// CHECK1: omp_offload.cont:
351// CHECK1-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
352// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
353// CHECK1-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_4]], align 4
354// CHECK1-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
355// CHECK1-NEXT: [[CONV6:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED5]] to i32*
356// CHECK1-NEXT: store i32 [[TMP23]], i32* [[CONV6]], align 4
357// CHECK1-NEXT: [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED5]], align 8
358// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
359// CHECK1-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i64*
360// CHECK1-NEXT: store i64 [[TMP24]], i64* [[TMP26]], align 8
361// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
362// CHECK1-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i64*
363// CHECK1-NEXT: store i64 [[TMP24]], i64* [[TMP28]], align 8
364// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
365// CHECK1-NEXT: store i8* null, i8** [[TMP29]], align 8
366// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
367// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
368// CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
369// CHECK1-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
370// CHECK1-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
371// CHECK1-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED10:%.*]], label [[OMP_OFFLOAD_CONT11:%.*]]
372// CHECK1: omp_offload.failed10:
373// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i64 [[TMP24]]) #[[ATTR2]]
374// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT11]]
375// CHECK1: omp_offload.cont11:
376// CHECK1-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
377// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP35]], 1
378// CHECK1-NEXT: ret i32 [[ADD12]]
379//
380//
381// CHECK1-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900382// CHECK1-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700383// CHECK1-NEXT: entry:
384// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
385// CHECK1-NEXT: [[A:%.*]] = alloca i32, align 4
386// CHECK1-NEXT: [[B:%.*]] = alloca i16, align 2
387// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
388// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
389// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
390// CHECK1-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
391// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
392// CHECK1-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
393// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
394// CHECK1-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
395// CHECK1-NEXT: store i32 0, i32* [[A]], align 4
396// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
397// CHECK1-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
398// CHECK1-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
399// CHECK1: omp_offload.failed:
400// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
401// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT]]
402// CHECK1: omp_offload.cont:
403// CHECK1-NEXT: store i16 1, i16* [[B]], align 2
404// CHECK1-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
405// CHECK1-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
406// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
407// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
408// CHECK1-NEXT: store i32 [[TMP3]], i32* [[CONV]], align 4
409// CHECK1-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
410// CHECK1-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
411// CHECK1-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_CASTED]] to i16*
412// CHECK1-NEXT: store i16 [[TMP5]], i16* [[CONV1]], align 2
413// CHECK1-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
414// CHECK1-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
415// CHECK1-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i16*
416// CHECK1-NEXT: store i16 [[TMP7]], i16* [[CONV2]], align 2
417// CHECK1-NEXT: [[TMP8:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
418// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
419// CHECK1-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
420// CHECK1-NEXT: store i64 [[TMP4]], i64* [[TMP10]], align 8
421// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
422// CHECK1-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
423// CHECK1-NEXT: store i64 [[TMP4]], i64* [[TMP12]], align 8
424// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
425// CHECK1-NEXT: store i8* null, i8** [[TMP13]], align 8
426// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
427// CHECK1-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
428// CHECK1-NEXT: store i64 [[TMP6]], i64* [[TMP15]], align 8
429// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
430// CHECK1-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
431// CHECK1-NEXT: store i64 [[TMP6]], i64* [[TMP17]], align 8
432// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
433// CHECK1-NEXT: store i8* null, i8** [[TMP18]], align 8
434// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
435// CHECK1-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i64*
436// CHECK1-NEXT: store i64 [[TMP8]], i64* [[TMP20]], align 8
437// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
438// CHECK1-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i64*
439// CHECK1-NEXT: store i64 [[TMP8]], i64* [[TMP22]], align 8
440// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
441// CHECK1-NEXT: store i8* null, i8** [[TMP23]], align 8
442// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
443// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
444// CHECK1-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
445// CHECK1-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
446// CHECK1-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
447// CHECK1-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
448// CHECK1-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED3:%.*]], label [[OMP_OFFLOAD_CONT4:%.*]]
449// CHECK1: omp_offload.failed3:
450// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]]) #[[ATTR2]]
451// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT4]]
452// CHECK1: omp_offload.cont4:
453// CHECK1-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
454// CHECK1-NEXT: ret i32 [[TMP30]]
455//
456//
457// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900458// CHECK1-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700459// CHECK1-NEXT: entry:
460// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
461// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
462// CHECK1-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700463// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700464// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
465// CHECK1-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
466// CHECK1-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
467// CHECK1-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
468// CHECK1-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
469// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
470// CHECK1-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
471// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
472// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700473// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
474// CHECK1-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
475// CHECK1-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
476// CHECK1-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
477// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700478// CHECK1-NEXT: ret void
479//
480//
481// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900482// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700483// CHECK1-NEXT: entry:
484// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
485// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700486// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
487// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700488// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
489// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700490// CHECK1-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
491// CHECK1-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
492// CHECK1-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
493// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
494// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
495// CHECK1-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
496// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
497// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700498// CHECK1-NEXT: store double [[ADD]], double* [[A]], align 8
499// CHECK1-NEXT: ret void
500//
501//
502// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900503// CHECK1-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700504// CHECK1-NEXT: entry:
505// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
506// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
507// CHECK1-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
508// CHECK1-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
509// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700510// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700511// CHECK1-NEXT: ret void
512//
513//
514// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900515// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700516// CHECK1-NEXT: entry:
517// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
518// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700519// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700520// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
521// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700522// CHECK1-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
523// CHECK1-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
524// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700525// CHECK1-NEXT: store double 2.500000e+00, double* [[A]], align 8
526// CHECK1-NEXT: ret void
527//
528//
529// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900530// CHECK1-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700531// CHECK1-NEXT: entry:
532// CHECK1-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
533// CHECK1-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
534// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
535// CHECK1-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
536// CHECK1-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
537// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
538// CHECK1-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
539// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
540// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
541// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700542// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700543// CHECK1-NEXT: ret void
544//
545//
546// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900547// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700548// CHECK1-NEXT: entry:
549// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
550// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
551// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
552// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
553// CHECK1-NEXT: ret void
554//
555//
556// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900557// CHECK1-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700558// CHECK1-NEXT: entry:
559// CHECK1-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
560// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
561// CHECK1-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
562// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
563// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
564// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700565// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700566// CHECK1-NEXT: ret void
567//
568//
569// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900570// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700571// CHECK1-NEXT: entry:
572// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
573// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
574// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
575// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
576// CHECK1-NEXT: ret void
577//
578//
579// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -0400580// CHECK1-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700581// CHECK1-NEXT: entry:
582// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
583// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700584// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700585// CHECK1-NEXT: ret void
586//
587//
588// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900589// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700590// CHECK1-NEXT: entry:
591// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
592// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
593// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
594// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
595// CHECK1-NEXT: ret void
596//
597//
598// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900599// CHECK1-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700600// CHECK1-NEXT: entry:
601// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
602// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
603// CHECK1-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700604// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
605// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700606// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
607// CHECK1-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
608// CHECK1-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
609// CHECK1-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
610// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
611// CHECK1-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
612// CHECK1-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
613// CHECK1-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
614// CHECK1-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
615// CHECK1-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700616// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
617// CHECK1-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
618// CHECK1-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
619// CHECK1-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
620// CHECK1-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
621// CHECK1-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
622// CHECK1-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
623// CHECK1-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
624// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700625// CHECK1-NEXT: ret void
626//
627//
628// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900629// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700630// CHECK1-NEXT: entry:
631// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
632// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700633// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
634// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700635// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
636// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700637// CHECK1-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
638// CHECK1-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
639// CHECK1-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
640// CHECK1-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
641// CHECK1-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
642// CHECK1-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
643// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
644// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
645// CHECK1-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700646// CHECK1-NEXT: ret void
647//
648//
649// CHECK1-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -0400650// CHECK1-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700651// CHECK1-NEXT: entry:
652// CHECK1-NEXT: call void @__tgt_register_requires(i64 1)
653// CHECK1-NEXT: ret void
654//
655//
656// CHECK2-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900657// CHECK2-SAME: (i32 signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700658// CHECK2-NEXT: entry:
659// CHECK2-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
660// CHECK2-NEXT: [[A:%.*]] = alloca i32, align 4
661// CHECK2-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 8
662// CHECK2-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
663// CHECK2-NEXT: store i32 0, i32* [[A]], align 4
664// CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900665// CHECK2-NEXT: [[CALL:%.*]] = call signext i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 8 dereferenceable(8) [[S]], i32 signext [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700666// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
667// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
668// CHECK2-NEXT: store i32 [[ADD]], i32* [[A]], align 4
669// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900670// CHECK2-NEXT: [[CALL1:%.*]] = call signext i32 @_ZL7fstatici(i32 signext [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700671// CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
672// CHECK2-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
673// CHECK2-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
674// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900675// CHECK2-NEXT: [[CALL3:%.*]] = call signext i32 @_Z9ftemplateIiET_i(i32 signext [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700676// CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
677// CHECK2-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
678// CHECK2-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
679// CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
680// CHECK2-NEXT: ret i32 [[TMP6]]
681//
682//
683// CHECK2-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900684// CHECK2-SAME: (%struct.S1* nonnull align 8 dereferenceable(8) [[THIS:%.*]], i32 signext [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700685// CHECK2-NEXT: entry:
686// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
687// CHECK2-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
688// CHECK2-NEXT: [[B:%.*]] = alloca i32, align 4
689// CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
690// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
691// CHECK2-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
692// CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
693// CHECK2-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
694// CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
695// CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [1 x i8*], align 8
696// CHECK2-NEXT: [[DOTOFFLOAD_PTRS5:%.*]] = alloca [1 x i8*], align 8
697// CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [1 x i8*], align 8
698// CHECK2-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
699// CHECK2-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
700// CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
701// CHECK2-NEXT: store i32 1, i32* [[B]], align 4
702// CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
703// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
704// CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
705// CHECK2-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
706// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
707// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[B_CASTED]] to i32*
708// CHECK2-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
709// CHECK2-NEXT: [[TMP3:%.*]] = load i64, i64* [[B_CASTED]], align 8
710// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
711// CHECK2-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
712// CHECK2-NEXT: store i32 [[TMP4]], i32* [[CONV2]], align 4
713// CHECK2-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
714// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
715// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
716// CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
717// CHECK2-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 8
718// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
719// CHECK2-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
720// CHECK2-NEXT: store double* [[A]], double** [[TMP9]], align 8
721// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
722// CHECK2-NEXT: store i8* null, i8** [[TMP10]], align 8
723// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
724// CHECK2-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
725// CHECK2-NEXT: store i64 [[TMP3]], i64* [[TMP12]], align 8
726// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
727// CHECK2-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
728// CHECK2-NEXT: store i64 [[TMP3]], i64* [[TMP14]], align 8
729// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
730// CHECK2-NEXT: store i8* null, i8** [[TMP15]], align 8
731// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
732// CHECK2-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
733// CHECK2-NEXT: store i64 [[TMP5]], i64* [[TMP17]], align 8
734// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
735// CHECK2-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i64*
736// CHECK2-NEXT: store i64 [[TMP5]], i64* [[TMP19]], align 8
737// CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
738// CHECK2-NEXT: store i8* null, i8** [[TMP20]], align 8
739// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
740// CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
741// CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
742// CHECK2-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
743// CHECK2-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
744// CHECK2-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
745// CHECK2: omp_offload.failed:
746// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2:[0-9]+]]
747// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT]]
748// CHECK2: omp_offload.cont:
749// CHECK2-NEXT: [[A3:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
750// CHECK2-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
751// CHECK2-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
752// CHECK2-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 8
753// CHECK2-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
754// CHECK2-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
755// CHECK2-NEXT: store double* [[A3]], double** [[TMP29]], align 8
756// CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i64 0, i64 0
757// CHECK2-NEXT: store i8* null, i8** [[TMP30]], align 8
758// CHECK2-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
759// CHECK2-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
760// CHECK2-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
761// CHECK2-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
762// CHECK2-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
763// CHECK2: omp_offload.failed7:
764// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
765// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT8]]
766// CHECK2: omp_offload.cont8:
767// CHECK2-NEXT: [[A9:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
768// CHECK2-NEXT: [[TMP35:%.*]] = load double, double* [[A9]], align 8
769// CHECK2-NEXT: [[CONV10:%.*]] = fptosi double [[TMP35]] to i32
770// CHECK2-NEXT: ret i32 [[CONV10]]
771//
772//
773// CHECK2-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900774// CHECK2-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700775// CHECK2-NEXT: entry:
776// CHECK2-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
777// CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
778// CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
779// CHECK2-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
780// CHECK2-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i64, align 8
781// CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 8
782// CHECK2-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 8
783// CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 8
784// CHECK2-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i32, align 4
785// CHECK2-NEXT: [[DOTCAPTURE_EXPR__CASTED5:%.*]] = alloca i64, align 8
786// CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [1 x i8*], align 8
787// CHECK2-NEXT: [[DOTOFFLOAD_PTRS8:%.*]] = alloca [1 x i8*], align 8
788// CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [1 x i8*], align 8
789// CHECK2-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
790// CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
791// CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
792// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
793// CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
794// CHECK2-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
795// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
796// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
797// CHECK2-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
798// CHECK2-NEXT: [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
799// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
800// CHECK2-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED2]] to i32*
801// CHECK2-NEXT: store i32 [[TMP4]], i32* [[CONV3]], align 4
802// CHECK2-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED2]], align 8
803// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
804// CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
805// CHECK2-NEXT: store i64 [[TMP3]], i64* [[TMP7]], align 8
806// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
807// CHECK2-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
808// CHECK2-NEXT: store i64 [[TMP3]], i64* [[TMP9]], align 8
809// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
810// CHECK2-NEXT: store i8* null, i8** [[TMP10]], align 8
811// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
812// CHECK2-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
813// CHECK2-NEXT: store i64 [[TMP5]], i64* [[TMP12]], align 8
814// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
815// CHECK2-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
816// CHECK2-NEXT: store i64 [[TMP5]], i64* [[TMP14]], align 8
817// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
818// CHECK2-NEXT: store i8* null, i8** [[TMP15]], align 8
819// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
820// CHECK2-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
821// CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
822// CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
823// CHECK2-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
824// CHECK2-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
825// CHECK2-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
826// CHECK2: omp_offload.failed:
827// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2]]
828// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT]]
829// CHECK2: omp_offload.cont:
830// CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
831// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
832// CHECK2-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_4]], align 4
833// CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
834// CHECK2-NEXT: [[CONV6:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED5]] to i32*
835// CHECK2-NEXT: store i32 [[TMP23]], i32* [[CONV6]], align 4
836// CHECK2-NEXT: [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED5]], align 8
837// CHECK2-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
838// CHECK2-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i64*
839// CHECK2-NEXT: store i64 [[TMP24]], i64* [[TMP26]], align 8
840// CHECK2-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
841// CHECK2-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i64*
842// CHECK2-NEXT: store i64 [[TMP24]], i64* [[TMP28]], align 8
843// CHECK2-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
844// CHECK2-NEXT: store i8* null, i8** [[TMP29]], align 8
845// CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
846// CHECK2-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
847// CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
848// CHECK2-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
849// CHECK2-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
850// CHECK2-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED10:%.*]], label [[OMP_OFFLOAD_CONT11:%.*]]
851// CHECK2: omp_offload.failed10:
852// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i64 [[TMP24]]) #[[ATTR2]]
853// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT11]]
854// CHECK2: omp_offload.cont11:
855// CHECK2-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
856// CHECK2-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP35]], 1
857// CHECK2-NEXT: ret i32 [[ADD12]]
858//
859//
860// CHECK2-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900861// CHECK2-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700862// CHECK2-NEXT: entry:
863// CHECK2-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
864// CHECK2-NEXT: [[A:%.*]] = alloca i32, align 4
865// CHECK2-NEXT: [[B:%.*]] = alloca i16, align 2
866// CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
867// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
868// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
869// CHECK2-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
870// CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
871// CHECK2-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
872// CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
873// CHECK2-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
874// CHECK2-NEXT: store i32 0, i32* [[A]], align 4
875// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
876// CHECK2-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
877// CHECK2-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
878// CHECK2: omp_offload.failed:
879// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
880// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT]]
881// CHECK2: omp_offload.cont:
882// CHECK2-NEXT: store i16 1, i16* [[B]], align 2
883// CHECK2-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
884// CHECK2-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
885// CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
886// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
887// CHECK2-NEXT: store i32 [[TMP3]], i32* [[CONV]], align 4
888// CHECK2-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
889// CHECK2-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
890// CHECK2-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_CASTED]] to i16*
891// CHECK2-NEXT: store i16 [[TMP5]], i16* [[CONV1]], align 2
892// CHECK2-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
893// CHECK2-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
894// CHECK2-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i16*
895// CHECK2-NEXT: store i16 [[TMP7]], i16* [[CONV2]], align 2
896// CHECK2-NEXT: [[TMP8:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
897// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
898// CHECK2-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
899// CHECK2-NEXT: store i64 [[TMP4]], i64* [[TMP10]], align 8
900// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
901// CHECK2-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
902// CHECK2-NEXT: store i64 [[TMP4]], i64* [[TMP12]], align 8
903// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
904// CHECK2-NEXT: store i8* null, i8** [[TMP13]], align 8
905// CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
906// CHECK2-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
907// CHECK2-NEXT: store i64 [[TMP6]], i64* [[TMP15]], align 8
908// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
909// CHECK2-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
910// CHECK2-NEXT: store i64 [[TMP6]], i64* [[TMP17]], align 8
911// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
912// CHECK2-NEXT: store i8* null, i8** [[TMP18]], align 8
913// CHECK2-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
914// CHECK2-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i64*
915// CHECK2-NEXT: store i64 [[TMP8]], i64* [[TMP20]], align 8
916// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
917// CHECK2-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i64*
918// CHECK2-NEXT: store i64 [[TMP8]], i64* [[TMP22]], align 8
919// CHECK2-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
920// CHECK2-NEXT: store i8* null, i8** [[TMP23]], align 8
921// CHECK2-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
922// CHECK2-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
923// CHECK2-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
924// CHECK2-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
925// CHECK2-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
926// CHECK2-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
927// CHECK2-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED3:%.*]], label [[OMP_OFFLOAD_CONT4:%.*]]
928// CHECK2: omp_offload.failed3:
929// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]]) #[[ATTR2]]
930// CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT4]]
931// CHECK2: omp_offload.cont4:
932// CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
933// CHECK2-NEXT: ret i32 [[TMP30]]
934//
935//
936// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900937// CHECK2-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700938// CHECK2-NEXT: entry:
939// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
940// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
941// CHECK2-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700942// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700943// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
944// CHECK2-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
945// CHECK2-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
946// CHECK2-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
947// CHECK2-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
948// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
949// CHECK2-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
950// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
951// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700952// CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
953// CHECK2-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
954// CHECK2-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
955// CHECK2-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
956// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700957// CHECK2-NEXT: ret void
958//
959//
960// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900961// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700962// CHECK2-NEXT: entry:
963// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
964// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700965// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
966// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700967// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
968// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700969// CHECK2-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
970// CHECK2-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
971// CHECK2-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
972// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
973// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
974// CHECK2-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
975// CHECK2-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
976// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700977// CHECK2-NEXT: store double [[ADD]], double* [[A]], align 8
978// CHECK2-NEXT: ret void
979//
980//
981// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900982// CHECK2-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700983// CHECK2-NEXT: entry:
984// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
985// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
986// CHECK2-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
987// CHECK2-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
988// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700989// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700990// CHECK2-NEXT: ret void
991//
992//
993// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900994// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700995// CHECK2-NEXT: entry:
996// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
997// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700998// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700999// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1000// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001001// CHECK2-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
1002// CHECK2-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
1003// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001004// CHECK2-NEXT: store double 2.500000e+00, double* [[A]], align 8
1005// CHECK2-NEXT: ret void
1006//
1007//
1008// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001009// CHECK2-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001010// CHECK2-NEXT: entry:
1011// CHECK2-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
1012// CHECK2-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
1013// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1014// CHECK2-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
1015// CHECK2-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
1016// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
1017// CHECK2-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
1018// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
1019// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
1020// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001021// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001022// CHECK2-NEXT: ret void
1023//
1024//
1025// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001026// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001027// CHECK2-NEXT: entry:
1028// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1029// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1030// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1031// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1032// CHECK2-NEXT: ret void
1033//
1034//
1035// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001036// CHECK2-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001037// CHECK2-NEXT: entry:
1038// CHECK2-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
1039// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1040// CHECK2-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
1041// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
1042// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
1043// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001044// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001045// CHECK2-NEXT: ret void
1046//
1047//
1048// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001049// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001050// CHECK2-NEXT: entry:
1051// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1052// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1053// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1054// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1055// CHECK2-NEXT: ret void
1056//
1057//
1058// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04001059// CHECK2-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001060// CHECK2-NEXT: entry:
1061// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1062// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001063// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001064// CHECK2-NEXT: ret void
1065//
1066//
1067// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001068// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001069// CHECK2-NEXT: entry:
1070// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1071// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1072// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1073// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1074// CHECK2-NEXT: ret void
1075//
1076//
1077// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001078// CHECK2-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001079// CHECK2-NEXT: entry:
1080// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1081// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
1082// CHECK2-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001083// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1084// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001085// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1086// CHECK2-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
1087// CHECK2-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
1088// CHECK2-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
1089// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
1090// CHECK2-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
1091// CHECK2-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
1092// CHECK2-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
1093// CHECK2-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
1094// CHECK2-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001095// CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
1096// CHECK2-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
1097// CHECK2-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
1098// CHECK2-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
1099// CHECK2-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
1100// CHECK2-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
1101// CHECK2-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
1102// CHECK2-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
1103// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001104// CHECK2-NEXT: ret void
1105//
1106//
1107// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001108// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001109// CHECK2-NEXT: entry:
1110// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1111// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001112// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1113// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001114// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1115// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001116// CHECK2-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
1117// CHECK2-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
1118// CHECK2-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
1119// CHECK2-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
1120// CHECK2-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
1121// CHECK2-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
1122// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
1123// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
1124// CHECK2-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001125// CHECK2-NEXT: ret void
1126//
1127//
1128// CHECK2-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04001129// CHECK2-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001130// CHECK2-NEXT: entry:
1131// CHECK2-NEXT: call void @__tgt_register_requires(i64 1)
1132// CHECK2-NEXT: ret void
1133//
1134//
1135// CHECK3-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001136// CHECK3-SAME: (i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001137// CHECK3-NEXT: entry:
1138// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1139// CHECK3-NEXT: [[A:%.*]] = alloca i32, align 4
1140// CHECK3-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 4
1141// CHECK3-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1142// CHECK3-NEXT: store i32 0, i32* [[A]], align 4
1143// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001144// CHECK3-NEXT: [[CALL:%.*]] = call i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 4 dereferenceable(8) [[S]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001145// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
1146// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
1147// CHECK3-NEXT: store i32 [[ADD]], i32* [[A]], align 4
1148// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001149// CHECK3-NEXT: [[CALL1:%.*]] = call i32 @_ZL7fstatici(i32 [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001150// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
1151// CHECK3-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
1152// CHECK3-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
1153// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001154// CHECK3-NEXT: [[CALL3:%.*]] = call i32 @_Z9ftemplateIiET_i(i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001155// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
1156// CHECK3-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
1157// CHECK3-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
1158// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
1159// CHECK3-NEXT: ret i32 [[TMP6]]
1160//
1161//
1162// CHECK3-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001163// CHECK3-SAME: (%struct.S1* nonnull align 4 dereferenceable(8) [[THIS:%.*]], i32 [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001164// CHECK3-NEXT: entry:
1165// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1166// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1167// CHECK3-NEXT: [[B:%.*]] = alloca i32, align 4
1168// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1169// CHECK3-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
1170// CHECK3-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1171// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
1172// CHECK3-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
1173// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
1174// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
1175// CHECK3-NEXT: [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
1176// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
1177// CHECK3-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1178// CHECK3-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1179// CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1180// CHECK3-NEXT: store i32 1, i32* [[B]], align 4
1181// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
1182// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
1183// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
1184// CHECK3-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
1185// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
1186// CHECK3-NEXT: store i32 [[TMP2]], i32* [[B_CASTED]], align 4
1187// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_CASTED]], align 4
1188// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1189// CHECK3-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1190// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1191// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
1192// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1193// CHECK3-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
1194// CHECK3-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 4
1195// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1196// CHECK3-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
1197// CHECK3-NEXT: store double* [[A]], double** [[TMP9]], align 4
1198// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1199// CHECK3-NEXT: store i8* null, i8** [[TMP10]], align 4
1200// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1201// CHECK3-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1202// CHECK3-NEXT: store i32 [[TMP3]], i32* [[TMP12]], align 4
1203// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1204// CHECK3-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
1205// CHECK3-NEXT: store i32 [[TMP3]], i32* [[TMP14]], align 4
1206// CHECK3-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1207// CHECK3-NEXT: store i8* null, i8** [[TMP15]], align 4
1208// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
1209// CHECK3-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
1210// CHECK3-NEXT: store i32 [[TMP5]], i32* [[TMP17]], align 4
1211// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
1212// CHECK3-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32*
1213// CHECK3-NEXT: store i32 [[TMP5]], i32* [[TMP19]], align 4
1214// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
1215// CHECK3-NEXT: store i8* null, i8** [[TMP20]], align 4
1216// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1217// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1218// CHECK3-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1219// CHECK3-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
1220// CHECK3-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
1221// CHECK3-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1222// CHECK3: omp_offload.failed:
1223// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2:[0-9]+]]
1224// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT]]
1225// CHECK3: omp_offload.cont:
1226// CHECK3-NEXT: [[A2:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
1227// CHECK3-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1228// CHECK3-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
1229// CHECK3-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 4
1230// CHECK3-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1231// CHECK3-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
1232// CHECK3-NEXT: store double* [[A2]], double** [[TMP29]], align 4
1233// CHECK3-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
1234// CHECK3-NEXT: store i8* null, i8** [[TMP30]], align 4
1235// CHECK3-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1236// CHECK3-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1237// CHECK3-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
1238// CHECK3-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
1239// CHECK3-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
1240// CHECK3: omp_offload.failed6:
1241// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
1242// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT7]]
1243// CHECK3: omp_offload.cont7:
1244// CHECK3-NEXT: [[A8:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
1245// CHECK3-NEXT: [[TMP35:%.*]] = load double, double* [[A8]], align 4
1246// CHECK3-NEXT: [[CONV:%.*]] = fptosi double [[TMP35]] to i32
1247// CHECK3-NEXT: ret i32 [[CONV]]
1248//
1249//
1250// CHECK3-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001251// CHECK3-SAME: (i32 [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001252// CHECK3-NEXT: entry:
1253// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1254// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1255// CHECK3-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1256// CHECK3-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1257// CHECK3-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i32, align 4
1258// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 4
1259// CHECK3-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 4
1260// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 4
1261// CHECK3-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4
1262// CHECK3-NEXT: [[DOTCAPTURE_EXPR__CASTED4:%.*]] = alloca i32, align 4
1263// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 4
1264// CHECK3-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 4
1265// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 4
1266// CHECK3-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1267// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
1268// CHECK3-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
1269// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
1270// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
1271// CHECK3-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1272// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1273// CHECK3-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1274// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1275// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1276// CHECK3-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
1277// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
1278// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1279// CHECK3-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
1280// CHECK3-NEXT: store i32 [[TMP3]], i32* [[TMP7]], align 4
1281// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1282// CHECK3-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
1283// CHECK3-NEXT: store i32 [[TMP3]], i32* [[TMP9]], align 4
1284// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1285// CHECK3-NEXT: store i8* null, i8** [[TMP10]], align 4
1286// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1287// CHECK3-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1288// CHECK3-NEXT: store i32 [[TMP5]], i32* [[TMP12]], align 4
1289// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1290// CHECK3-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
1291// CHECK3-NEXT: store i32 [[TMP5]], i32* [[TMP14]], align 4
1292// CHECK3-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1293// CHECK3-NEXT: store i8* null, i8** [[TMP15]], align 4
1294// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1295// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1296// CHECK3-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1297// CHECK3-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1298// CHECK3-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
1299// CHECK3-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
1300// CHECK3-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1301// CHECK3: omp_offload.failed:
1302// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2]]
1303// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT]]
1304// CHECK3: omp_offload.cont:
1305// CHECK3-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
1306// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
1307// CHECK3-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_3]], align 4
1308// CHECK3-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
1309// CHECK3-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
1310// CHECK3-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
1311// CHECK3-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
1312// CHECK3-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i32*
1313// CHECK3-NEXT: store i32 [[TMP24]], i32* [[TMP26]], align 4
1314// CHECK3-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
1315// CHECK3-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i32*
1316// CHECK3-NEXT: store i32 [[TMP24]], i32* [[TMP28]], align 4
1317// CHECK3-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0
1318// CHECK3-NEXT: store i8* null, i8** [[TMP29]], align 4
1319// CHECK3-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
1320// CHECK3-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
1321// CHECK3-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
1322// CHECK3-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
1323// CHECK3-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
1324// CHECK3-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
1325// CHECK3: omp_offload.failed8:
1326// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i32 [[TMP24]]) #[[ATTR2]]
1327// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT9]]
1328// CHECK3: omp_offload.cont9:
1329// CHECK3-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
1330// CHECK3-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP35]], 1
1331// CHECK3-NEXT: ret i32 [[ADD10]]
1332//
1333//
1334// CHECK3-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001335// CHECK3-SAME: (i32 [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001336// CHECK3-NEXT: entry:
1337// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1338// CHECK3-NEXT: [[A:%.*]] = alloca i32, align 4
1339// CHECK3-NEXT: [[B:%.*]] = alloca i16, align 2
1340// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
1341// CHECK3-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
1342// CHECK3-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
1343// CHECK3-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1344// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
1345// CHECK3-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
1346// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
1347// CHECK3-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1348// CHECK3-NEXT: store i32 0, i32* [[A]], align 4
1349// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
1350// CHECK3-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
1351// CHECK3-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1352// CHECK3: omp_offload.failed:
1353// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
1354// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT]]
1355// CHECK3: omp_offload.cont:
1356// CHECK3-NEXT: store i16 1, i16* [[B]], align 2
1357// CHECK3-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
1358// CHECK3-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
1359// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
1360// CHECK3-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
1361// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
1362// CHECK3-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
1363// CHECK3-NEXT: [[CONV:%.*]] = bitcast i32* [[B_CASTED]] to i16*
1364// CHECK3-NEXT: store i16 [[TMP5]], i16* [[CONV]], align 2
1365// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
1366// CHECK3-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
1367// CHECK3-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__CASTED]] to i16*
1368// CHECK3-NEXT: store i16 [[TMP7]], i16* [[CONV1]], align 2
1369// CHECK3-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1370// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1371// CHECK3-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
1372// CHECK3-NEXT: store i32 [[TMP4]], i32* [[TMP10]], align 4
1373// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1374// CHECK3-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1375// CHECK3-NEXT: store i32 [[TMP4]], i32* [[TMP12]], align 4
1376// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1377// CHECK3-NEXT: store i8* null, i8** [[TMP13]], align 4
1378// CHECK3-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1379// CHECK3-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
1380// CHECK3-NEXT: store i32 [[TMP6]], i32* [[TMP15]], align 4
1381// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1382// CHECK3-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
1383// CHECK3-NEXT: store i32 [[TMP6]], i32* [[TMP17]], align 4
1384// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1385// CHECK3-NEXT: store i8* null, i8** [[TMP18]], align 4
1386// CHECK3-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
1387// CHECK3-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32*
1388// CHECK3-NEXT: store i32 [[TMP8]], i32* [[TMP20]], align 4
1389// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
1390// CHECK3-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32*
1391// CHECK3-NEXT: store i32 [[TMP8]], i32* [[TMP22]], align 4
1392// CHECK3-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
1393// CHECK3-NEXT: store i8* null, i8** [[TMP23]], align 4
1394// CHECK3-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1395// CHECK3-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1396// CHECK3-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
1397// CHECK3-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
1398// CHECK3-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
1399// CHECK3-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
1400// CHECK3-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED2:%.*]], label [[OMP_OFFLOAD_CONT3:%.*]]
1401// CHECK3: omp_offload.failed2:
1402// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i32 [[TMP4]], i32 [[TMP6]], i32 [[TMP8]]) #[[ATTR2]]
1403// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT3]]
1404// CHECK3: omp_offload.cont3:
1405// CHECK3-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
1406// CHECK3-NEXT: ret i32 [[TMP30]]
1407//
1408//
1409// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001410// CHECK3-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001411// CHECK3-NEXT: entry:
1412// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1413// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
1414// CHECK3-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001415// CHECK3-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001416// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1417// CHECK3-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1418// CHECK3-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1419// CHECK3-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1420// CHECK3-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1421// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1422// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001423// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
1424// CHECK3-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
1425// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
1426// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001427// CHECK3-NEXT: ret void
1428//
1429//
1430// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001431// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001432// CHECK3-NEXT: entry:
1433// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1434// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001435// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1436// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001437// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1438// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001439// CHECK3-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1440// CHECK3-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1441// CHECK3-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1442// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
1443// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001444// CHECK3-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001445// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001446// CHECK3-NEXT: store double [[ADD]], double* [[A]], align 4
1447// CHECK3-NEXT: ret void
1448//
1449//
1450// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001451// CHECK3-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001452// CHECK3-NEXT: entry:
1453// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1454// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1455// CHECK3-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1456// CHECK3-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1457// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001458// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001459// CHECK3-NEXT: ret void
1460//
1461//
1462// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001463// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001464// CHECK3-NEXT: entry:
1465// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1466// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001467// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001468// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1469// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001470// CHECK3-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1471// CHECK3-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1472// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001473// CHECK3-NEXT: store double 2.500000e+00, double* [[A]], align 4
1474// CHECK3-NEXT: ret void
1475//
1476//
1477// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001478// CHECK3-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001479// CHECK3-NEXT: entry:
1480// CHECK3-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
1481// CHECK3-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
1482// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1483// CHECK3-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1484// CHECK3-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
1485// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1486// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
1487// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001488// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001489// CHECK3-NEXT: ret void
1490//
1491//
1492// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001493// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001494// CHECK3-NEXT: entry:
1495// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1496// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1497// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1498// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1499// CHECK3-NEXT: ret void
1500//
1501//
1502// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001503// CHECK3-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001504// CHECK3-NEXT: entry:
1505// CHECK3-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
1506// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1507// CHECK3-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1508// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1509// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001510// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001511// CHECK3-NEXT: ret void
1512//
1513//
1514// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001515// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001516// CHECK3-NEXT: entry:
1517// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1518// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1519// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1520// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1521// CHECK3-NEXT: ret void
1522//
1523//
1524// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04001525// CHECK3-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001526// CHECK3-NEXT: entry:
1527// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1528// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001529// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001530// CHECK3-NEXT: ret void
1531//
1532//
1533// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001534// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001535// CHECK3-NEXT: entry:
1536// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1537// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1538// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1539// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1540// CHECK3-NEXT: ret void
1541//
1542//
1543// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001544// CHECK3-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001545// CHECK3-NEXT: entry:
1546// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
1547// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
1548// CHECK3-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001549// CHECK3-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
1550// CHECK3-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001551// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1552// CHECK3-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
1553// CHECK3-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1554// CHECK3-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1555// CHECK3-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
1556// CHECK3-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
1557// CHECK3-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
1558// CHECK3-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
1559// CHECK3-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001560// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
1561// CHECK3-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
1562// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
1563// CHECK3-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
1564// CHECK3-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
1565// CHECK3-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
1566// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
1567// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001568// CHECK3-NEXT: ret void
1569//
1570//
1571// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001572// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001573// CHECK3-NEXT: entry:
1574// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1575// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001576// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
1577// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001578// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1579// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001580// CHECK3-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
1581// CHECK3-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1582// CHECK3-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
1583// CHECK3-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
1584// CHECK3-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
1585// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
1586// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
1587// CHECK3-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001588// CHECK3-NEXT: ret void
1589//
1590//
1591// CHECK3-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04001592// CHECK3-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001593// CHECK3-NEXT: entry:
1594// CHECK3-NEXT: call void @__tgt_register_requires(i64 1)
1595// CHECK3-NEXT: ret void
1596//
1597//
1598// CHECK4-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001599// CHECK4-SAME: (i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001600// CHECK4-NEXT: entry:
1601// CHECK4-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1602// CHECK4-NEXT: [[A:%.*]] = alloca i32, align 4
1603// CHECK4-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 4
1604// CHECK4-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1605// CHECK4-NEXT: store i32 0, i32* [[A]], align 4
1606// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001607// CHECK4-NEXT: [[CALL:%.*]] = call i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 4 dereferenceable(8) [[S]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001608// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
1609// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
1610// CHECK4-NEXT: store i32 [[ADD]], i32* [[A]], align 4
1611// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001612// CHECK4-NEXT: [[CALL1:%.*]] = call i32 @_ZL7fstatici(i32 [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001613// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
1614// CHECK4-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
1615// CHECK4-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
1616// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001617// CHECK4-NEXT: [[CALL3:%.*]] = call i32 @_Z9ftemplateIiET_i(i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001618// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
1619// CHECK4-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
1620// CHECK4-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
1621// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
1622// CHECK4-NEXT: ret i32 [[TMP6]]
1623//
1624//
1625// CHECK4-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001626// CHECK4-SAME: (%struct.S1* nonnull align 4 dereferenceable(8) [[THIS:%.*]], i32 [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001627// CHECK4-NEXT: entry:
1628// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1629// CHECK4-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1630// CHECK4-NEXT: [[B:%.*]] = alloca i32, align 4
1631// CHECK4-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1632// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
1633// CHECK4-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1634// CHECK4-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
1635// CHECK4-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
1636// CHECK4-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
1637// CHECK4-NEXT: [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
1638// CHECK4-NEXT: [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
1639// CHECK4-NEXT: [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
1640// CHECK4-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1641// CHECK4-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1642// CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1643// CHECK4-NEXT: store i32 1, i32* [[B]], align 4
1644// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
1645// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
1646// CHECK4-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
1647// CHECK4-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
1648// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
1649// CHECK4-NEXT: store i32 [[TMP2]], i32* [[B_CASTED]], align 4
1650// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_CASTED]], align 4
1651// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1652// CHECK4-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1653// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1654// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
1655// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1656// CHECK4-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
1657// CHECK4-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 4
1658// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1659// CHECK4-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
1660// CHECK4-NEXT: store double* [[A]], double** [[TMP9]], align 4
1661// CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1662// CHECK4-NEXT: store i8* null, i8** [[TMP10]], align 4
1663// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1664// CHECK4-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1665// CHECK4-NEXT: store i32 [[TMP3]], i32* [[TMP12]], align 4
1666// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1667// CHECK4-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
1668// CHECK4-NEXT: store i32 [[TMP3]], i32* [[TMP14]], align 4
1669// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1670// CHECK4-NEXT: store i8* null, i8** [[TMP15]], align 4
1671// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
1672// CHECK4-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
1673// CHECK4-NEXT: store i32 [[TMP5]], i32* [[TMP17]], align 4
1674// CHECK4-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
1675// CHECK4-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32*
1676// CHECK4-NEXT: store i32 [[TMP5]], i32* [[TMP19]], align 4
1677// CHECK4-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
1678// CHECK4-NEXT: store i8* null, i8** [[TMP20]], align 4
1679// CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1680// CHECK4-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1681// CHECK4-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1682// CHECK4-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
1683// CHECK4-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
1684// CHECK4-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1685// CHECK4: omp_offload.failed:
1686// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2:[0-9]+]]
1687// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT]]
1688// CHECK4: omp_offload.cont:
1689// CHECK4-NEXT: [[A2:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
1690// CHECK4-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1691// CHECK4-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
1692// CHECK4-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 4
1693// CHECK4-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1694// CHECK4-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
1695// CHECK4-NEXT: store double* [[A2]], double** [[TMP29]], align 4
1696// CHECK4-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
1697// CHECK4-NEXT: store i8* null, i8** [[TMP30]], align 4
1698// CHECK4-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1699// CHECK4-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1700// CHECK4-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
1701// CHECK4-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
1702// CHECK4-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
1703// CHECK4: omp_offload.failed6:
1704// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
1705// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT7]]
1706// CHECK4: omp_offload.cont7:
1707// CHECK4-NEXT: [[A8:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
1708// CHECK4-NEXT: [[TMP35:%.*]] = load double, double* [[A8]], align 4
1709// CHECK4-NEXT: [[CONV:%.*]] = fptosi double [[TMP35]] to i32
1710// CHECK4-NEXT: ret i32 [[CONV]]
1711//
1712//
1713// CHECK4-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001714// CHECK4-SAME: (i32 [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001715// CHECK4-NEXT: entry:
1716// CHECK4-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1717// CHECK4-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1718// CHECK4-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1719// CHECK4-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1720// CHECK4-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i32, align 4
1721// CHECK4-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 4
1722// CHECK4-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 4
1723// CHECK4-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 4
1724// CHECK4-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4
1725// CHECK4-NEXT: [[DOTCAPTURE_EXPR__CASTED4:%.*]] = alloca i32, align 4
1726// CHECK4-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 4
1727// CHECK4-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 4
1728// CHECK4-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 4
1729// CHECK4-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1730// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
1731// CHECK4-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
1732// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
1733// CHECK4-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
1734// CHECK4-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1735// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1736// CHECK4-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1737// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1738// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1739// CHECK4-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
1740// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
1741// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1742// CHECK4-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
1743// CHECK4-NEXT: store i32 [[TMP3]], i32* [[TMP7]], align 4
1744// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1745// CHECK4-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
1746// CHECK4-NEXT: store i32 [[TMP3]], i32* [[TMP9]], align 4
1747// CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1748// CHECK4-NEXT: store i8* null, i8** [[TMP10]], align 4
1749// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1750// CHECK4-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1751// CHECK4-NEXT: store i32 [[TMP5]], i32* [[TMP12]], align 4
1752// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1753// CHECK4-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
1754// CHECK4-NEXT: store i32 [[TMP5]], i32* [[TMP14]], align 4
1755// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1756// CHECK4-NEXT: store i8* null, i8** [[TMP15]], align 4
1757// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1758// CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1759// CHECK4-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1760// CHECK4-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1761// CHECK4-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
1762// CHECK4-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
1763// CHECK4-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1764// CHECK4: omp_offload.failed:
1765// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2]]
1766// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT]]
1767// CHECK4: omp_offload.cont:
1768// CHECK4-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
1769// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
1770// CHECK4-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_3]], align 4
1771// CHECK4-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
1772// CHECK4-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
1773// CHECK4-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
1774// CHECK4-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
1775// CHECK4-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i32*
1776// CHECK4-NEXT: store i32 [[TMP24]], i32* [[TMP26]], align 4
1777// CHECK4-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
1778// CHECK4-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i32*
1779// CHECK4-NEXT: store i32 [[TMP24]], i32* [[TMP28]], align 4
1780// CHECK4-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0
1781// CHECK4-NEXT: store i8* null, i8** [[TMP29]], align 4
1782// CHECK4-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
1783// CHECK4-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
1784// CHECK4-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
1785// CHECK4-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
1786// CHECK4-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
1787// CHECK4-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
1788// CHECK4: omp_offload.failed8:
1789// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i32 [[TMP24]]) #[[ATTR2]]
1790// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT9]]
1791// CHECK4: omp_offload.cont9:
1792// CHECK4-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
1793// CHECK4-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP35]], 1
1794// CHECK4-NEXT: ret i32 [[ADD10]]
1795//
1796//
1797// CHECK4-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001798// CHECK4-SAME: (i32 [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001799// CHECK4-NEXT: entry:
1800// CHECK4-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
1801// CHECK4-NEXT: [[A:%.*]] = alloca i32, align 4
1802// CHECK4-NEXT: [[B:%.*]] = alloca i16, align 2
1803// CHECK4-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
1804// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
1805// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
1806// CHECK4-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
1807// CHECK4-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
1808// CHECK4-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
1809// CHECK4-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
1810// CHECK4-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
1811// CHECK4-NEXT: store i32 0, i32* [[A]], align 4
1812// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
1813// CHECK4-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
1814// CHECK4-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1815// CHECK4: omp_offload.failed:
1816// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
1817// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT]]
1818// CHECK4: omp_offload.cont:
1819// CHECK4-NEXT: store i16 1, i16* [[B]], align 2
1820// CHECK4-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
1821// CHECK4-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
1822// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
1823// CHECK4-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
1824// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
1825// CHECK4-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
1826// CHECK4-NEXT: [[CONV:%.*]] = bitcast i32* [[B_CASTED]] to i16*
1827// CHECK4-NEXT: store i16 [[TMP5]], i16* [[CONV]], align 2
1828// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
1829// CHECK4-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
1830// CHECK4-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__CASTED]] to i16*
1831// CHECK4-NEXT: store i16 [[TMP7]], i16* [[CONV1]], align 2
1832// CHECK4-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
1833// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1834// CHECK4-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
1835// CHECK4-NEXT: store i32 [[TMP4]], i32* [[TMP10]], align 4
1836// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1837// CHECK4-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
1838// CHECK4-NEXT: store i32 [[TMP4]], i32* [[TMP12]], align 4
1839// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1840// CHECK4-NEXT: store i8* null, i8** [[TMP13]], align 4
1841// CHECK4-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
1842// CHECK4-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
1843// CHECK4-NEXT: store i32 [[TMP6]], i32* [[TMP15]], align 4
1844// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
1845// CHECK4-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
1846// CHECK4-NEXT: store i32 [[TMP6]], i32* [[TMP17]], align 4
1847// CHECK4-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
1848// CHECK4-NEXT: store i8* null, i8** [[TMP18]], align 4
1849// CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
1850// CHECK4-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32*
1851// CHECK4-NEXT: store i32 [[TMP8]], i32* [[TMP20]], align 4
1852// CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
1853// CHECK4-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32*
1854// CHECK4-NEXT: store i32 [[TMP8]], i32* [[TMP22]], align 4
1855// CHECK4-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
1856// CHECK4-NEXT: store i8* null, i8** [[TMP23]], align 4
1857// CHECK4-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1858// CHECK4-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1859// CHECK4-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
1860// CHECK4-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
1861// CHECK4-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
1862// CHECK4-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
1863// CHECK4-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED2:%.*]], label [[OMP_OFFLOAD_CONT3:%.*]]
1864// CHECK4: omp_offload.failed2:
1865// CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i32 [[TMP4]], i32 [[TMP6]], i32 [[TMP8]]) #[[ATTR2]]
1866// CHECK4-NEXT: br label [[OMP_OFFLOAD_CONT3]]
1867// CHECK4: omp_offload.cont3:
1868// CHECK4-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
1869// CHECK4-NEXT: ret i32 [[TMP30]]
1870//
1871//
1872// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001873// CHECK4-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001874// CHECK4-NEXT: entry:
1875// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1876// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
1877// CHECK4-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001878// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001879// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1880// CHECK4-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1881// CHECK4-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1882// CHECK4-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1883// CHECK4-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1884// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1885// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001886// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
1887// CHECK4-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
1888// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
1889// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001890// CHECK4-NEXT: ret void
1891//
1892//
1893// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001894// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001895// CHECK4-NEXT: entry:
1896// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1897// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001898// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1899// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001900// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1901// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001902// CHECK4-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1903// CHECK4-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
1904// CHECK4-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1905// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
1906// CHECK4-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001907// CHECK4-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001908// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001909// CHECK4-NEXT: store double [[ADD]], double* [[A]], align 4
1910// CHECK4-NEXT: ret void
1911//
1912//
1913// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001914// CHECK4-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001915// CHECK4-NEXT: entry:
1916// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
1917// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1918// CHECK4-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1919// CHECK4-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1920// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001921// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001922// CHECK4-NEXT: ret void
1923//
1924//
1925// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001926// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001927// CHECK4-NEXT: entry:
1928// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1929// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001930// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001931// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1932// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001933// CHECK4-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
1934// CHECK4-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
1935// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001936// CHECK4-NEXT: store double 2.500000e+00, double* [[A]], align 4
1937// CHECK4-NEXT: ret void
1938//
1939//
1940// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001941// CHECK4-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001942// CHECK4-NEXT: entry:
1943// CHECK4-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
1944// CHECK4-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
1945// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1946// CHECK4-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1947// CHECK4-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
1948// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1949// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
1950// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001951// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001952// CHECK4-NEXT: ret void
1953//
1954//
1955// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001956// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001957// CHECK4-NEXT: entry:
1958// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1959// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1960// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1961// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1962// CHECK4-NEXT: ret void
1963//
1964//
1965// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001966// CHECK4-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001967// CHECK4-NEXT: entry:
1968// CHECK4-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
1969// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1970// CHECK4-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1971// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
1972// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001973// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001974// CHECK4-NEXT: ret void
1975//
1976//
1977// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001978// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001979// CHECK4-NEXT: entry:
1980// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1981// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1982// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1983// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1984// CHECK4-NEXT: ret void
1985//
1986//
1987// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04001988// CHECK4-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001989// CHECK4-NEXT: entry:
1990// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1991// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001992// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001993// CHECK4-NEXT: ret void
1994//
1995//
1996// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001997// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001998// CHECK4-NEXT: entry:
1999// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2000// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2001// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2002// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2003// CHECK4-NEXT: ret void
2004//
2005//
2006// CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002007// CHECK4-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002008// CHECK4-NEXT: entry:
2009// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2010// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
2011// CHECK4-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002012// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
2013// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002014// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2015// CHECK4-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2016// CHECK4-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2017// CHECK4-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2018// CHECK4-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2019// CHECK4-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
2020// CHECK4-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
2021// CHECK4-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
2022// CHECK4-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002023// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
2024// CHECK4-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
2025// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
2026// CHECK4-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
2027// CHECK4-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
2028// CHECK4-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
2029// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
2030// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002031// CHECK4-NEXT: ret void
2032//
2033//
2034// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002035// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002036// CHECK4-NEXT: entry:
2037// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2038// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002039// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2040// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002041// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2042// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002043// CHECK4-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2044// CHECK4-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2045// CHECK4-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2046// CHECK4-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
2047// CHECK4-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
2048// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
2049// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
2050// CHECK4-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002051// CHECK4-NEXT: ret void
2052//
2053//
2054// CHECK4-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04002055// CHECK4-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002056// CHECK4-NEXT: entry:
2057// CHECK4-NEXT: call void @__tgt_register_requires(i64 1)
2058// CHECK4-NEXT: ret void
2059//
2060//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002061// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002062// CHECK9-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002063// CHECK9-NEXT: entry:
2064// CHECK9-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
2065// CHECK9-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
2066// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
2067// CHECK9-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2068// CHECK9-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
2069// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2070// CHECK9-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
2071// CHECK9-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2072// CHECK9-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
2073// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002074// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002075// CHECK9-NEXT: ret void
2076//
2077//
2078// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002079// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002080// CHECK9-NEXT: entry:
2081// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2082// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2083// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2084// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2085// CHECK9-NEXT: ret void
2086//
2087//
2088// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002089// CHECK9-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002090// CHECK9-NEXT: entry:
2091// CHECK9-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
2092// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2093// CHECK9-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2094// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2095// CHECK9-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2096// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002097// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002098// CHECK9-NEXT: ret void
2099//
2100//
2101// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002102// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002103// CHECK9-NEXT: entry:
2104// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2105// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2106// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2107// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2108// CHECK9-NEXT: ret void
2109//
2110//
2111// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002112// CHECK9-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002113// CHECK9-NEXT: entry:
2114// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2115// CHECK9-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
2116// CHECK9-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002117// CHECK9-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002118// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2119// CHECK9-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2120// CHECK9-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2121// CHECK9-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2122// CHECK9-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2123// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
2124// CHECK9-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2125// CHECK9-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
2126// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002127// CHECK9-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
2128// CHECK9-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
2129// CHECK9-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
2130// CHECK9-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
2131// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002132// CHECK9-NEXT: ret void
2133//
2134//
2135// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002136// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002137// CHECK9-NEXT: entry:
2138// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2139// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002140// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2141// CHECK9-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002142// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2143// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002144// CHECK9-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2145// CHECK9-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2146// CHECK9-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2147// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
2148// CHECK9-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2149// CHECK9-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
2150// CHECK9-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
2151// CHECK9-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002152// CHECK9-NEXT: store double [[ADD]], double* [[A]], align 8
2153// CHECK9-NEXT: ret void
2154//
2155//
2156// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002157// CHECK9-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002158// CHECK9-NEXT: entry:
2159// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2160// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2161// CHECK9-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2162// CHECK9-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2163// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002164// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002165// CHECK9-NEXT: ret void
2166//
2167//
2168// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002169// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002170// CHECK9-NEXT: entry:
2171// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2172// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002173// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002174// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2175// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002176// CHECK9-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2177// CHECK9-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2178// CHECK9-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002179// CHECK9-NEXT: store double 2.500000e+00, double* [[A]], align 8
2180// CHECK9-NEXT: ret void
2181//
2182//
2183// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04002184// CHECK9-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002185// CHECK9-NEXT: entry:
2186// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2187// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002188// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002189// CHECK9-NEXT: ret void
2190//
2191//
2192// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002193// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002194// CHECK9-NEXT: entry:
2195// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2196// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2197// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2198// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2199// CHECK9-NEXT: ret void
2200//
2201//
2202// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002203// CHECK9-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002204// CHECK9-NEXT: entry:
2205// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2206// CHECK9-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
2207// CHECK9-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002208// CHECK9-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2209// CHECK9-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002210// CHECK9-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2211// CHECK9-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
2212// CHECK9-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2213// CHECK9-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2214// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
2215// CHECK9-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
2216// CHECK9-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
2217// CHECK9-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
2218// CHECK9-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
2219// CHECK9-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002220// CHECK9-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
2221// CHECK9-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
2222// CHECK9-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
2223// CHECK9-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
2224// CHECK9-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
2225// CHECK9-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
2226// CHECK9-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
2227// CHECK9-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
2228// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002229// CHECK9-NEXT: ret void
2230//
2231//
2232// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002233// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002234// CHECK9-NEXT: entry:
2235// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2236// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002237// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2238// CHECK9-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002239// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2240// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002241// CHECK9-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
2242// CHECK9-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2243// CHECK9-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
2244// CHECK9-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
2245// CHECK9-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
2246// CHECK9-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
2247// CHECK9-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2248// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
2249// CHECK9-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002250// CHECK9-NEXT: ret void
2251//
2252//
2253// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002254// CHECK10-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002255// CHECK10-NEXT: entry:
2256// CHECK10-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
2257// CHECK10-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
2258// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
2259// CHECK10-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2260// CHECK10-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
2261// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2262// CHECK10-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
2263// CHECK10-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2264// CHECK10-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
2265// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002266// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002267// CHECK10-NEXT: ret void
2268//
2269//
2270// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002271// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002272// CHECK10-NEXT: entry:
2273// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2274// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2275// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2276// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2277// CHECK10-NEXT: ret void
2278//
2279//
2280// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002281// CHECK10-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002282// CHECK10-NEXT: entry:
2283// CHECK10-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
2284// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2285// CHECK10-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2286// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2287// CHECK10-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2288// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002289// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002290// CHECK10-NEXT: ret void
2291//
2292//
2293// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002294// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002295// CHECK10-NEXT: entry:
2296// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2297// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2298// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2299// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2300// CHECK10-NEXT: ret void
2301//
2302//
2303// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002304// CHECK10-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002305// CHECK10-NEXT: entry:
2306// CHECK10-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2307// CHECK10-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
2308// CHECK10-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002309// CHECK10-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002310// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2311// CHECK10-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2312// CHECK10-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2313// CHECK10-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2314// CHECK10-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2315// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
2316// CHECK10-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2317// CHECK10-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
2318// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002319// CHECK10-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
2320// CHECK10-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
2321// CHECK10-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
2322// CHECK10-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
2323// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002324// CHECK10-NEXT: ret void
2325//
2326//
2327// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002328// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002329// CHECK10-NEXT: entry:
2330// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2331// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002332// CHECK10-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2333// CHECK10-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002334// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2335// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002336// CHECK10-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2337// CHECK10-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2338// CHECK10-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2339// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
2340// CHECK10-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2341// CHECK10-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
2342// CHECK10-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
2343// CHECK10-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002344// CHECK10-NEXT: store double [[ADD]], double* [[A]], align 8
2345// CHECK10-NEXT: ret void
2346//
2347//
2348// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002349// CHECK10-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002350// CHECK10-NEXT: entry:
2351// CHECK10-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2352// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2353// CHECK10-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2354// CHECK10-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2355// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002356// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002357// CHECK10-NEXT: ret void
2358//
2359//
2360// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002361// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002362// CHECK10-NEXT: entry:
2363// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2364// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002365// CHECK10-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002366// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2367// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002368// CHECK10-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2369// CHECK10-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2370// CHECK10-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002371// CHECK10-NEXT: store double 2.500000e+00, double* [[A]], align 8
2372// CHECK10-NEXT: ret void
2373//
2374//
2375// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04002376// CHECK10-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002377// CHECK10-NEXT: entry:
2378// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2379// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002380// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002381// CHECK10-NEXT: ret void
2382//
2383//
2384// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002385// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002386// CHECK10-NEXT: entry:
2387// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2388// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2389// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2390// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2391// CHECK10-NEXT: ret void
2392//
2393//
2394// CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002395// CHECK10-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002396// CHECK10-NEXT: entry:
2397// CHECK10-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2398// CHECK10-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
2399// CHECK10-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002400// CHECK10-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2401// CHECK10-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002402// CHECK10-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2403// CHECK10-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
2404// CHECK10-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2405// CHECK10-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2406// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
2407// CHECK10-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
2408// CHECK10-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
2409// CHECK10-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
2410// CHECK10-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
2411// CHECK10-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002412// CHECK10-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
2413// CHECK10-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
2414// CHECK10-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
2415// CHECK10-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
2416// CHECK10-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
2417// CHECK10-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
2418// CHECK10-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
2419// CHECK10-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
2420// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002421// CHECK10-NEXT: ret void
2422//
2423//
2424// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002425// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002426// CHECK10-NEXT: entry:
2427// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2428// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002429// CHECK10-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2430// CHECK10-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002431// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2432// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002433// CHECK10-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
2434// CHECK10-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
2435// CHECK10-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
2436// CHECK10-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
2437// CHECK10-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
2438// CHECK10-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
2439// CHECK10-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
2440// CHECK10-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
2441// CHECK10-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002442// CHECK10-NEXT: ret void
2443//
2444//
2445// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002446// CHECK11-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002447// CHECK11-NEXT: entry:
2448// CHECK11-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
2449// CHECK11-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
2450// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
2451// CHECK11-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2452// CHECK11-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
2453// CHECK11-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2454// CHECK11-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
2455// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002456// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002457// CHECK11-NEXT: ret void
2458//
2459//
2460// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002461// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002462// CHECK11-NEXT: entry:
2463// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2464// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2465// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2466// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2467// CHECK11-NEXT: ret void
2468//
2469//
2470// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002471// CHECK11-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002472// CHECK11-NEXT: entry:
2473// CHECK11-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
2474// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2475// CHECK11-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2476// CHECK11-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2477// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002478// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002479// CHECK11-NEXT: ret void
2480//
2481//
2482// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002483// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002484// CHECK11-NEXT: entry:
2485// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2486// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2487// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2488// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2489// CHECK11-NEXT: ret void
2490//
2491//
2492// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002493// CHECK11-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002494// CHECK11-NEXT: entry:
2495// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2496// CHECK11-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
2497// CHECK11-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002498// CHECK11-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002499// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2500// CHECK11-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2501// CHECK11-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2502// CHECK11-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2503// CHECK11-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2504// CHECK11-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2505// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002506// CHECK11-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
2507// CHECK11-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
2508// CHECK11-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
2509// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002510// CHECK11-NEXT: ret void
2511//
2512//
2513// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002514// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002515// CHECK11-NEXT: entry:
2516// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2517// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002518// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2519// CHECK11-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002520// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2521// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002522// CHECK11-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2523// CHECK11-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2524// CHECK11-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2525// CHECK11-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
2526// CHECK11-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002527// CHECK11-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002528// CHECK11-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002529// CHECK11-NEXT: store double [[ADD]], double* [[A]], align 4
2530// CHECK11-NEXT: ret void
2531//
2532//
2533// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002534// CHECK11-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002535// CHECK11-NEXT: entry:
2536// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2537// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2538// CHECK11-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2539// CHECK11-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2540// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002541// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002542// CHECK11-NEXT: ret void
2543//
2544//
2545// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002546// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002547// CHECK11-NEXT: entry:
2548// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2549// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002550// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002551// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2552// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002553// CHECK11-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2554// CHECK11-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2555// CHECK11-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002556// CHECK11-NEXT: store double 2.500000e+00, double* [[A]], align 4
2557// CHECK11-NEXT: ret void
2558//
2559//
2560// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04002561// CHECK11-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002562// CHECK11-NEXT: entry:
2563// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2564// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002565// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002566// CHECK11-NEXT: ret void
2567//
2568//
2569// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002570// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002571// CHECK11-NEXT: entry:
2572// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2573// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2574// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2575// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2576// CHECK11-NEXT: ret void
2577//
2578//
2579// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002580// CHECK11-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002581// CHECK11-NEXT: entry:
2582// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2583// CHECK11-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
2584// CHECK11-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002585// CHECK11-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
2586// CHECK11-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002587// CHECK11-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2588// CHECK11-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2589// CHECK11-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2590// CHECK11-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2591// CHECK11-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2592// CHECK11-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
2593// CHECK11-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
2594// CHECK11-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
2595// CHECK11-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002596// CHECK11-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
2597// CHECK11-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
2598// CHECK11-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
2599// CHECK11-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
2600// CHECK11-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
2601// CHECK11-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
2602// CHECK11-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
2603// CHECK11-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002604// CHECK11-NEXT: ret void
2605//
2606//
2607// CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002608// CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002609// CHECK11-NEXT: entry:
2610// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2611// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002612// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2613// CHECK11-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002614// CHECK11-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2615// CHECK11-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002616// CHECK11-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2617// CHECK11-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2618// CHECK11-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2619// CHECK11-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
2620// CHECK11-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
2621// CHECK11-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
2622// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
2623// CHECK11-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002624// CHECK11-NEXT: ret void
2625//
2626//
2627// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002628// CHECK12-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002629// CHECK12-NEXT: entry:
2630// CHECK12-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
2631// CHECK12-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
2632// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
2633// CHECK12-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2634// CHECK12-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
2635// CHECK12-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2636// CHECK12-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
2637// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002638// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002639// CHECK12-NEXT: ret void
2640//
2641//
2642// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002643// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002644// CHECK12-NEXT: entry:
2645// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2646// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2647// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2648// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2649// CHECK12-NEXT: ret void
2650//
2651//
2652// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002653// CHECK12-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002654// CHECK12-NEXT: entry:
2655// CHECK12-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
2656// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2657// CHECK12-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2658// CHECK12-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2659// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002660// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002661// CHECK12-NEXT: ret void
2662//
2663//
2664// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002665// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002666// CHECK12-NEXT: entry:
2667// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2668// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2669// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2670// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2671// CHECK12-NEXT: ret void
2672//
2673//
2674// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002675// CHECK12-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002676// CHECK12-NEXT: entry:
2677// CHECK12-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2678// CHECK12-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
2679// CHECK12-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002680// CHECK12-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002681// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2682// CHECK12-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2683// CHECK12-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2684// CHECK12-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2685// CHECK12-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2686// CHECK12-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2687// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002688// CHECK12-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
2689// CHECK12-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
2690// CHECK12-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
2691// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002692// CHECK12-NEXT: ret void
2693//
2694//
2695// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002696// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002697// CHECK12-NEXT: entry:
2698// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2699// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002700// CHECK12-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2701// CHECK12-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002702// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2703// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002704// CHECK12-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2705// CHECK12-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2706// CHECK12-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2707// CHECK12-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
2708// CHECK12-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002709// CHECK12-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002710// CHECK12-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002711// CHECK12-NEXT: store double [[ADD]], double* [[A]], align 4
2712// CHECK12-NEXT: ret void
2713//
2714//
2715// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002716// CHECK12-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002717// CHECK12-NEXT: entry:
2718// CHECK12-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
2719// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2720// CHECK12-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2721// CHECK12-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2722// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002723// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002724// CHECK12-NEXT: ret void
2725//
2726//
2727// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002728// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002729// CHECK12-NEXT: entry:
2730// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2731// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002732// CHECK12-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002733// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2734// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002735// CHECK12-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
2736// CHECK12-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
2737// CHECK12-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002738// CHECK12-NEXT: store double 2.500000e+00, double* [[A]], align 4
2739// CHECK12-NEXT: ret void
2740//
2741//
2742// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04002743// CHECK12-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002744// CHECK12-NEXT: entry:
2745// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2746// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002747// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002748// CHECK12-NEXT: ret void
2749//
2750//
2751// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002752// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002753// CHECK12-NEXT: entry:
2754// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2755// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2756// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2757// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2758// CHECK12-NEXT: ret void
2759//
2760//
2761// CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002762// CHECK12-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002763// CHECK12-NEXT: entry:
2764// CHECK12-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2765// CHECK12-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
2766// CHECK12-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002767// CHECK12-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
2768// CHECK12-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002769// CHECK12-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2770// CHECK12-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2771// CHECK12-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2772// CHECK12-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
2773// CHECK12-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2774// CHECK12-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
2775// CHECK12-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
2776// CHECK12-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
2777// CHECK12-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002778// CHECK12-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
2779// CHECK12-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
2780// CHECK12-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
2781// CHECK12-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
2782// CHECK12-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
2783// CHECK12-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
2784// CHECK12-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
2785// CHECK12-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002786// CHECK12-NEXT: ret void
2787//
2788//
2789// CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002790// CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002791// CHECK12-NEXT: entry:
2792// CHECK12-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2793// CHECK12-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002794// CHECK12-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
2795// CHECK12-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002796// CHECK12-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2797// CHECK12-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002798// CHECK12-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
2799// CHECK12-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
2800// CHECK12-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
2801// CHECK12-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
2802// CHECK12-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
2803// CHECK12-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
2804// CHECK12-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
2805// CHECK12-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002806// CHECK12-NEXT: ret void
2807//
2808//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002809// CHECK17-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002810// CHECK17-SAME: (i32 signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002811// CHECK17-NEXT: entry:
2812// CHECK17-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
2813// CHECK17-NEXT: [[A:%.*]] = alloca i32, align 4
2814// CHECK17-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 8
2815// CHECK17-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
2816// CHECK17-NEXT: store i32 0, i32* [[A]], align 4
2817// CHECK17-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002818// CHECK17-NEXT: [[CALL:%.*]] = call signext i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 8 dereferenceable(8) [[S]], i32 signext [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002819// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
2820// CHECK17-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
2821// CHECK17-NEXT: store i32 [[ADD]], i32* [[A]], align 4
2822// CHECK17-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002823// CHECK17-NEXT: [[CALL1:%.*]] = call signext i32 @_ZL7fstatici(i32 signext [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002824// CHECK17-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
2825// CHECK17-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
2826// CHECK17-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
2827// CHECK17-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002828// CHECK17-NEXT: [[CALL3:%.*]] = call signext i32 @_Z9ftemplateIiET_i(i32 signext [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002829// CHECK17-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
2830// CHECK17-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
2831// CHECK17-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
2832// CHECK17-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
2833// CHECK17-NEXT: ret i32 [[TMP6]]
2834//
2835//
2836// CHECK17-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002837// CHECK17-SAME: (%struct.S1* nonnull align 8 dereferenceable(8) [[THIS:%.*]], i32 signext [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002838// CHECK17-NEXT: entry:
2839// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
2840// CHECK17-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
2841// CHECK17-NEXT: [[B:%.*]] = alloca i32, align 4
2842// CHECK17-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2843// CHECK17-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
2844// CHECK17-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
2845// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
2846// CHECK17-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
2847// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
2848// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [1 x i8*], align 8
2849// CHECK17-NEXT: [[DOTOFFLOAD_PTRS5:%.*]] = alloca [1 x i8*], align 8
2850// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [1 x i8*], align 8
2851// CHECK17-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
2852// CHECK17-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
2853// CHECK17-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
2854// CHECK17-NEXT: store i32 1, i32* [[B]], align 4
2855// CHECK17-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
2856// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
2857// CHECK17-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
2858// CHECK17-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
2859// CHECK17-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
2860// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[B_CASTED]] to i32*
2861// CHECK17-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
2862// CHECK17-NEXT: [[TMP3:%.*]] = load i64, i64* [[B_CASTED]], align 8
2863// CHECK17-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2864// CHECK17-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
2865// CHECK17-NEXT: store i32 [[TMP4]], i32* [[CONV2]], align 4
2866// CHECK17-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
2867// CHECK17-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
2868// CHECK17-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2869// CHECK17-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
2870// CHECK17-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 8
2871// CHECK17-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2872// CHECK17-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
2873// CHECK17-NEXT: store double* [[A]], double** [[TMP9]], align 8
2874// CHECK17-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
2875// CHECK17-NEXT: store i8* null, i8** [[TMP10]], align 8
2876// CHECK17-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
2877// CHECK17-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
2878// CHECK17-NEXT: store i64 [[TMP3]], i64* [[TMP12]], align 8
2879// CHECK17-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
2880// CHECK17-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
2881// CHECK17-NEXT: store i64 [[TMP3]], i64* [[TMP14]], align 8
2882// CHECK17-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
2883// CHECK17-NEXT: store i8* null, i8** [[TMP15]], align 8
2884// CHECK17-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
2885// CHECK17-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
2886// CHECK17-NEXT: store i64 [[TMP5]], i64* [[TMP17]], align 8
2887// CHECK17-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
2888// CHECK17-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i64*
2889// CHECK17-NEXT: store i64 [[TMP5]], i64* [[TMP19]], align 8
2890// CHECK17-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
2891// CHECK17-NEXT: store i8* null, i8** [[TMP20]], align 8
2892// CHECK17-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2893// CHECK17-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2894// CHECK17-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2895// CHECK17-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
2896// CHECK17-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
2897// CHECK17-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
2898// CHECK17: omp_offload.failed:
2899// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2:[0-9]+]]
2900// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT]]
2901// CHECK17: omp_offload.cont:
2902// CHECK17-NEXT: [[A3:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
2903// CHECK17-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
2904// CHECK17-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
2905// CHECK17-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 8
2906// CHECK17-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
2907// CHECK17-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
2908// CHECK17-NEXT: store double* [[A3]], double** [[TMP29]], align 8
2909// CHECK17-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i64 0, i64 0
2910// CHECK17-NEXT: store i8* null, i8** [[TMP30]], align 8
2911// CHECK17-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
2912// CHECK17-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
2913// CHECK17-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
2914// CHECK17-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
2915// CHECK17-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
2916// CHECK17: omp_offload.failed7:
2917// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
2918// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT8]]
2919// CHECK17: omp_offload.cont8:
2920// CHECK17-NEXT: [[A9:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
2921// CHECK17-NEXT: [[TMP35:%.*]] = load double, double* [[A9]], align 8
2922// CHECK17-NEXT: [[CONV10:%.*]] = fptosi double [[TMP35]] to i32
2923// CHECK17-NEXT: ret i32 [[CONV10]]
2924//
2925//
2926// CHECK17-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002927// CHECK17-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002928// CHECK17-NEXT: entry:
2929// CHECK17-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
2930// CHECK17-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2931// CHECK17-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2932// CHECK17-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
2933// CHECK17-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i64, align 8
2934// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 8
2935// CHECK17-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 8
2936// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 8
2937// CHECK17-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i32, align 4
2938// CHECK17-NEXT: [[DOTCAPTURE_EXPR__CASTED5:%.*]] = alloca i64, align 8
2939// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [1 x i8*], align 8
2940// CHECK17-NEXT: [[DOTOFFLOAD_PTRS8:%.*]] = alloca [1 x i8*], align 8
2941// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [1 x i8*], align 8
2942// CHECK17-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
2943// CHECK17-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
2944// CHECK17-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
2945// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
2946// CHECK17-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
2947// CHECK17-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2948// CHECK17-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2949// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
2950// CHECK17-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
2951// CHECK17-NEXT: [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
2952// CHECK17-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2953// CHECK17-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED2]] to i32*
2954// CHECK17-NEXT: store i32 [[TMP4]], i32* [[CONV3]], align 4
2955// CHECK17-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED2]], align 8
2956// CHECK17-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2957// CHECK17-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
2958// CHECK17-NEXT: store i64 [[TMP3]], i64* [[TMP7]], align 8
2959// CHECK17-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2960// CHECK17-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
2961// CHECK17-NEXT: store i64 [[TMP3]], i64* [[TMP9]], align 8
2962// CHECK17-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
2963// CHECK17-NEXT: store i8* null, i8** [[TMP10]], align 8
2964// CHECK17-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
2965// CHECK17-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
2966// CHECK17-NEXT: store i64 [[TMP5]], i64* [[TMP12]], align 8
2967// CHECK17-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
2968// CHECK17-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
2969// CHECK17-NEXT: store i64 [[TMP5]], i64* [[TMP14]], align 8
2970// CHECK17-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
2971// CHECK17-NEXT: store i8* null, i8** [[TMP15]], align 8
2972// CHECK17-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2973// CHECK17-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2974// CHECK17-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2975// CHECK17-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2976// CHECK17-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
2977// CHECK17-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
2978// CHECK17-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
2979// CHECK17: omp_offload.failed:
2980// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2]]
2981// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT]]
2982// CHECK17: omp_offload.cont:
2983// CHECK17-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
2984// CHECK17-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
2985// CHECK17-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_4]], align 4
2986// CHECK17-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
2987// CHECK17-NEXT: [[CONV6:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED5]] to i32*
2988// CHECK17-NEXT: store i32 [[TMP23]], i32* [[CONV6]], align 4
2989// CHECK17-NEXT: [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED5]], align 8
2990// CHECK17-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
2991// CHECK17-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i64*
2992// CHECK17-NEXT: store i64 [[TMP24]], i64* [[TMP26]], align 8
2993// CHECK17-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
2994// CHECK17-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i64*
2995// CHECK17-NEXT: store i64 [[TMP24]], i64* [[TMP28]], align 8
2996// CHECK17-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
2997// CHECK17-NEXT: store i8* null, i8** [[TMP29]], align 8
2998// CHECK17-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
2999// CHECK17-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
3000// CHECK17-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
3001// CHECK17-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
3002// CHECK17-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
3003// CHECK17-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED10:%.*]], label [[OMP_OFFLOAD_CONT11:%.*]]
3004// CHECK17: omp_offload.failed10:
3005// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i64 [[TMP24]]) #[[ATTR2]]
3006// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT11]]
3007// CHECK17: omp_offload.cont11:
3008// CHECK17-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
3009// CHECK17-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP35]], 1
3010// CHECK17-NEXT: ret i32 [[ADD12]]
3011//
3012//
3013// CHECK17-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003014// CHECK17-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003015// CHECK17-NEXT: entry:
3016// CHECK17-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3017// CHECK17-NEXT: [[A:%.*]] = alloca i32, align 4
3018// CHECK17-NEXT: [[B:%.*]] = alloca i16, align 2
3019// CHECK17-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
3020// CHECK17-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
3021// CHECK17-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
3022// CHECK17-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3023// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
3024// CHECK17-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
3025// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
3026// CHECK17-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3027// CHECK17-NEXT: store i32 0, i32* [[A]], align 4
3028// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
3029// CHECK17-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
3030// CHECK17-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3031// CHECK17: omp_offload.failed:
3032// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
3033// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT]]
3034// CHECK17: omp_offload.cont:
3035// CHECK17-NEXT: store i16 1, i16* [[B]], align 2
3036// CHECK17-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
3037// CHECK17-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
3038// CHECK17-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
3039// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
3040// CHECK17-NEXT: store i32 [[TMP3]], i32* [[CONV]], align 4
3041// CHECK17-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
3042// CHECK17-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
3043// CHECK17-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_CASTED]] to i16*
3044// CHECK17-NEXT: store i16 [[TMP5]], i16* [[CONV1]], align 2
3045// CHECK17-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
3046// CHECK17-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
3047// CHECK17-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i16*
3048// CHECK17-NEXT: store i16 [[TMP7]], i16* [[CONV2]], align 2
3049// CHECK17-NEXT: [[TMP8:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3050// CHECK17-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3051// CHECK17-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
3052// CHECK17-NEXT: store i64 [[TMP4]], i64* [[TMP10]], align 8
3053// CHECK17-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3054// CHECK17-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
3055// CHECK17-NEXT: store i64 [[TMP4]], i64* [[TMP12]], align 8
3056// CHECK17-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3057// CHECK17-NEXT: store i8* null, i8** [[TMP13]], align 8
3058// CHECK17-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3059// CHECK17-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
3060// CHECK17-NEXT: store i64 [[TMP6]], i64* [[TMP15]], align 8
3061// CHECK17-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3062// CHECK17-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
3063// CHECK17-NEXT: store i64 [[TMP6]], i64* [[TMP17]], align 8
3064// CHECK17-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
3065// CHECK17-NEXT: store i8* null, i8** [[TMP18]], align 8
3066// CHECK17-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
3067// CHECK17-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i64*
3068// CHECK17-NEXT: store i64 [[TMP8]], i64* [[TMP20]], align 8
3069// CHECK17-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
3070// CHECK17-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i64*
3071// CHECK17-NEXT: store i64 [[TMP8]], i64* [[TMP22]], align 8
3072// CHECK17-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
3073// CHECK17-NEXT: store i8* null, i8** [[TMP23]], align 8
3074// CHECK17-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3075// CHECK17-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3076// CHECK17-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
3077// CHECK17-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
3078// CHECK17-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
3079// CHECK17-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
3080// CHECK17-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED3:%.*]], label [[OMP_OFFLOAD_CONT4:%.*]]
3081// CHECK17: omp_offload.failed3:
3082// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]]) #[[ATTR2]]
3083// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT4]]
3084// CHECK17: omp_offload.cont4:
3085// CHECK17-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
3086// CHECK17-NEXT: ret i32 [[TMP30]]
3087//
3088//
3089// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003090// CHECK17-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003091// CHECK17-NEXT: entry:
3092// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3093// CHECK17-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
3094// CHECK17-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003095// CHECK17-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003096// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3097// CHECK17-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3098// CHECK17-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3099// CHECK17-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3100// CHECK17-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3101// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
3102// CHECK17-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3103// CHECK17-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
3104// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003105// CHECK17-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
3106// CHECK17-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
3107// CHECK17-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
3108// CHECK17-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
3109// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003110// CHECK17-NEXT: ret void
3111//
3112//
3113// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003114// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003115// CHECK17-NEXT: entry:
3116// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3117// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003118// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3119// CHECK17-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003120// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3121// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003122// CHECK17-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3123// CHECK17-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3124// CHECK17-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3125// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
3126// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3127// CHECK17-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
3128// CHECK17-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
3129// CHECK17-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003130// CHECK17-NEXT: store double [[ADD]], double* [[A]], align 8
3131// CHECK17-NEXT: ret void
3132//
3133//
3134// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003135// CHECK17-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003136// CHECK17-NEXT: entry:
3137// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3138// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3139// CHECK17-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3140// CHECK17-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3141// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003142// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003143// CHECK17-NEXT: ret void
3144//
3145//
3146// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003147// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003148// CHECK17-NEXT: entry:
3149// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3150// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003151// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003152// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3153// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003154// CHECK17-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3155// CHECK17-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3156// CHECK17-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003157// CHECK17-NEXT: store double 2.500000e+00, double* [[A]], align 8
3158// CHECK17-NEXT: ret void
3159//
3160//
3161// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003162// CHECK17-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003163// CHECK17-NEXT: entry:
3164// CHECK17-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3165// CHECK17-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
3166// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3167// CHECK17-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3168// CHECK17-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
3169// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3170// CHECK17-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
3171// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3172// CHECK17-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
3173// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003174// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003175// CHECK17-NEXT: ret void
3176//
3177//
3178// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003179// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003180// CHECK17-NEXT: entry:
3181// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3182// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3183// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3184// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3185// CHECK17-NEXT: ret void
3186//
3187//
3188// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003189// CHECK17-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003190// CHECK17-NEXT: entry:
3191// CHECK17-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3192// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3193// CHECK17-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3194// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3195// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3196// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003197// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003198// CHECK17-NEXT: ret void
3199//
3200//
3201// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003202// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003203// CHECK17-NEXT: entry:
3204// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3205// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3206// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3207// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3208// CHECK17-NEXT: ret void
3209//
3210//
3211// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04003212// CHECK17-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003213// CHECK17-NEXT: entry:
3214// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3215// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003216// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003217// CHECK17-NEXT: ret void
3218//
3219//
3220// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003221// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003222// CHECK17-NEXT: entry:
3223// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3224// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3225// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3226// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3227// CHECK17-NEXT: ret void
3228//
3229//
3230// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003231// CHECK17-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003232// CHECK17-NEXT: entry:
3233// CHECK17-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
3234// CHECK17-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
3235// CHECK17-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003236// CHECK17-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
3237// CHECK17-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003238// CHECK17-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3239// CHECK17-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
3240// CHECK17-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3241// CHECK17-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3242// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
3243// CHECK17-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
3244// CHECK17-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
3245// CHECK17-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
3246// CHECK17-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
3247// CHECK17-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003248// CHECK17-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
3249// CHECK17-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
3250// CHECK17-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
3251// CHECK17-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
3252// CHECK17-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
3253// CHECK17-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
3254// CHECK17-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
3255// CHECK17-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
3256// CHECK17-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003257// CHECK17-NEXT: ret void
3258//
3259//
3260// CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003261// CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003262// CHECK17-NEXT: entry:
3263// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3264// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003265// CHECK17-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
3266// CHECK17-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003267// CHECK17-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3268// CHECK17-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003269// CHECK17-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
3270// CHECK17-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3271// CHECK17-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
3272// CHECK17-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
3273// CHECK17-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
3274// CHECK17-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
3275// CHECK17-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3276// CHECK17-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
3277// CHECK17-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003278// CHECK17-NEXT: ret void
3279//
3280//
3281// CHECK17-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04003282// CHECK17-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003283// CHECK17-NEXT: entry:
3284// CHECK17-NEXT: call void @__tgt_register_requires(i64 1)
3285// CHECK17-NEXT: ret void
3286//
3287//
3288// CHECK18-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003289// CHECK18-SAME: (i32 signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003290// CHECK18-NEXT: entry:
3291// CHECK18-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3292// CHECK18-NEXT: [[A:%.*]] = alloca i32, align 4
3293// CHECK18-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 8
3294// CHECK18-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3295// CHECK18-NEXT: store i32 0, i32* [[A]], align 4
3296// CHECK18-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003297// CHECK18-NEXT: [[CALL:%.*]] = call signext i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 8 dereferenceable(8) [[S]], i32 signext [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003298// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
3299// CHECK18-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
3300// CHECK18-NEXT: store i32 [[ADD]], i32* [[A]], align 4
3301// CHECK18-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003302// CHECK18-NEXT: [[CALL1:%.*]] = call signext i32 @_ZL7fstatici(i32 signext [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003303// CHECK18-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
3304// CHECK18-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
3305// CHECK18-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
3306// CHECK18-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003307// CHECK18-NEXT: [[CALL3:%.*]] = call signext i32 @_Z9ftemplateIiET_i(i32 signext [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003308// CHECK18-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
3309// CHECK18-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
3310// CHECK18-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
3311// CHECK18-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
3312// CHECK18-NEXT: ret i32 [[TMP6]]
3313//
3314//
3315// CHECK18-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003316// CHECK18-SAME: (%struct.S1* nonnull align 8 dereferenceable(8) [[THIS:%.*]], i32 signext [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003317// CHECK18-NEXT: entry:
3318// CHECK18-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3319// CHECK18-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3320// CHECK18-NEXT: [[B:%.*]] = alloca i32, align 4
3321// CHECK18-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3322// CHECK18-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
3323// CHECK18-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3324// CHECK18-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
3325// CHECK18-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
3326// CHECK18-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
3327// CHECK18-NEXT: [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [1 x i8*], align 8
3328// CHECK18-NEXT: [[DOTOFFLOAD_PTRS5:%.*]] = alloca [1 x i8*], align 8
3329// CHECK18-NEXT: [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [1 x i8*], align 8
3330// CHECK18-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3331// CHECK18-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3332// CHECK18-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3333// CHECK18-NEXT: store i32 1, i32* [[B]], align 4
3334// CHECK18-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
3335// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
3336// CHECK18-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
3337// CHECK18-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
3338// CHECK18-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
3339// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[B_CASTED]] to i32*
3340// CHECK18-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
3341// CHECK18-NEXT: [[TMP3:%.*]] = load i64, i64* [[B_CASTED]], align 8
3342// CHECK18-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3343// CHECK18-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3344// CHECK18-NEXT: store i32 [[TMP4]], i32* [[CONV2]], align 4
3345// CHECK18-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3346// CHECK18-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
3347// CHECK18-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3348// CHECK18-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
3349// CHECK18-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 8
3350// CHECK18-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3351// CHECK18-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
3352// CHECK18-NEXT: store double* [[A]], double** [[TMP9]], align 8
3353// CHECK18-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3354// CHECK18-NEXT: store i8* null, i8** [[TMP10]], align 8
3355// CHECK18-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3356// CHECK18-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
3357// CHECK18-NEXT: store i64 [[TMP3]], i64* [[TMP12]], align 8
3358// CHECK18-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3359// CHECK18-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
3360// CHECK18-NEXT: store i64 [[TMP3]], i64* [[TMP14]], align 8
3361// CHECK18-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
3362// CHECK18-NEXT: store i8* null, i8** [[TMP15]], align 8
3363// CHECK18-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
3364// CHECK18-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
3365// CHECK18-NEXT: store i64 [[TMP5]], i64* [[TMP17]], align 8
3366// CHECK18-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
3367// CHECK18-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i64*
3368// CHECK18-NEXT: store i64 [[TMP5]], i64* [[TMP19]], align 8
3369// CHECK18-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
3370// CHECK18-NEXT: store i8* null, i8** [[TMP20]], align 8
3371// CHECK18-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3372// CHECK18-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3373// CHECK18-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3374// CHECK18-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
3375// CHECK18-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
3376// CHECK18-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3377// CHECK18: omp_offload.failed:
3378// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2:[0-9]+]]
3379// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT]]
3380// CHECK18: omp_offload.cont:
3381// CHECK18-NEXT: [[A3:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
3382// CHECK18-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
3383// CHECK18-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
3384// CHECK18-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 8
3385// CHECK18-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
3386// CHECK18-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
3387// CHECK18-NEXT: store double* [[A3]], double** [[TMP29]], align 8
3388// CHECK18-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i64 0, i64 0
3389// CHECK18-NEXT: store i8* null, i8** [[TMP30]], align 8
3390// CHECK18-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
3391// CHECK18-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
3392// CHECK18-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
3393// CHECK18-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
3394// CHECK18-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
3395// CHECK18: omp_offload.failed7:
3396// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
3397// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT8]]
3398// CHECK18: omp_offload.cont8:
3399// CHECK18-NEXT: [[A9:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
3400// CHECK18-NEXT: [[TMP35:%.*]] = load double, double* [[A9]], align 8
3401// CHECK18-NEXT: [[CONV10:%.*]] = fptosi double [[TMP35]] to i32
3402// CHECK18-NEXT: ret i32 [[CONV10]]
3403//
3404//
3405// CHECK18-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003406// CHECK18-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003407// CHECK18-NEXT: entry:
3408// CHECK18-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3409// CHECK18-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3410// CHECK18-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3411// CHECK18-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3412// CHECK18-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i64, align 8
3413// CHECK18-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 8
3414// CHECK18-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 8
3415// CHECK18-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 8
3416// CHECK18-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i32, align 4
3417// CHECK18-NEXT: [[DOTCAPTURE_EXPR__CASTED5:%.*]] = alloca i64, align 8
3418// CHECK18-NEXT: [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [1 x i8*], align 8
3419// CHECK18-NEXT: [[DOTOFFLOAD_PTRS8:%.*]] = alloca [1 x i8*], align 8
3420// CHECK18-NEXT: [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [1 x i8*], align 8
3421// CHECK18-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3422// CHECK18-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
3423// CHECK18-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
3424// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
3425// CHECK18-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
3426// CHECK18-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3427// CHECK18-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3428// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3429// CHECK18-NEXT: store i32 [[TMP2]], i32* [[CONV]], align 4
3430// CHECK18-NEXT: [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3431// CHECK18-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3432// CHECK18-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED2]] to i32*
3433// CHECK18-NEXT: store i32 [[TMP4]], i32* [[CONV3]], align 4
3434// CHECK18-NEXT: [[TMP5:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED2]], align 8
3435// CHECK18-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3436// CHECK18-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
3437// CHECK18-NEXT: store i64 [[TMP3]], i64* [[TMP7]], align 8
3438// CHECK18-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3439// CHECK18-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
3440// CHECK18-NEXT: store i64 [[TMP3]], i64* [[TMP9]], align 8
3441// CHECK18-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3442// CHECK18-NEXT: store i8* null, i8** [[TMP10]], align 8
3443// CHECK18-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3444// CHECK18-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
3445// CHECK18-NEXT: store i64 [[TMP5]], i64* [[TMP12]], align 8
3446// CHECK18-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3447// CHECK18-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i64*
3448// CHECK18-NEXT: store i64 [[TMP5]], i64* [[TMP14]], align 8
3449// CHECK18-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
3450// CHECK18-NEXT: store i8* null, i8** [[TMP15]], align 8
3451// CHECK18-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3452// CHECK18-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3453// CHECK18-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3454// CHECK18-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3455// CHECK18-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
3456// CHECK18-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
3457// CHECK18-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3458// CHECK18: omp_offload.failed:
3459// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i64 [[TMP3]], i64 [[TMP5]]) #[[ATTR2]]
3460// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT]]
3461// CHECK18: omp_offload.cont:
3462// CHECK18-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
3463// CHECK18-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
3464// CHECK18-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_4]], align 4
3465// CHECK18-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
3466// CHECK18-NEXT: [[CONV6:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED5]] to i32*
3467// CHECK18-NEXT: store i32 [[TMP23]], i32* [[CONV6]], align 4
3468// CHECK18-NEXT: [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED5]], align 8
3469// CHECK18-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
3470// CHECK18-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i64*
3471// CHECK18-NEXT: store i64 [[TMP24]], i64* [[TMP26]], align 8
3472// CHECK18-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
3473// CHECK18-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i64*
3474// CHECK18-NEXT: store i64 [[TMP24]], i64* [[TMP28]], align 8
3475// CHECK18-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
3476// CHECK18-NEXT: store i8* null, i8** [[TMP29]], align 8
3477// CHECK18-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
3478// CHECK18-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
3479// CHECK18-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4
3480// CHECK18-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
3481// CHECK18-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
3482// CHECK18-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED10:%.*]], label [[OMP_OFFLOAD_CONT11:%.*]]
3483// CHECK18: omp_offload.failed10:
3484// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i64 [[TMP24]]) #[[ATTR2]]
3485// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT11]]
3486// CHECK18: omp_offload.cont11:
3487// CHECK18-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
3488// CHECK18-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP35]], 1
3489// CHECK18-NEXT: ret i32 [[ADD12]]
3490//
3491//
3492// CHECK18-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003493// CHECK18-SAME: (i32 signext [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003494// CHECK18-NEXT: entry:
3495// CHECK18-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3496// CHECK18-NEXT: [[A:%.*]] = alloca i32, align 4
3497// CHECK18-NEXT: [[B:%.*]] = alloca i16, align 2
3498// CHECK18-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
3499// CHECK18-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
3500// CHECK18-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
3501// CHECK18-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3502// CHECK18-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
3503// CHECK18-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
3504// CHECK18-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
3505// CHECK18-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3506// CHECK18-NEXT: store i32 0, i32* [[A]], align 4
3507// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
3508// CHECK18-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
3509// CHECK18-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3510// CHECK18: omp_offload.failed:
3511// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
3512// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT]]
3513// CHECK18: omp_offload.cont:
3514// CHECK18-NEXT: store i16 1, i16* [[B]], align 2
3515// CHECK18-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
3516// CHECK18-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
3517// CHECK18-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
3518// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
3519// CHECK18-NEXT: store i32 [[TMP3]], i32* [[CONV]], align 4
3520// CHECK18-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
3521// CHECK18-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
3522// CHECK18-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_CASTED]] to i16*
3523// CHECK18-NEXT: store i16 [[TMP5]], i16* [[CONV1]], align 2
3524// CHECK18-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
3525// CHECK18-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
3526// CHECK18-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i16*
3527// CHECK18-NEXT: store i16 [[TMP7]], i16* [[CONV2]], align 2
3528// CHECK18-NEXT: [[TMP8:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3529// CHECK18-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3530// CHECK18-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
3531// CHECK18-NEXT: store i64 [[TMP4]], i64* [[TMP10]], align 8
3532// CHECK18-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3533// CHECK18-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i64*
3534// CHECK18-NEXT: store i64 [[TMP4]], i64* [[TMP12]], align 8
3535// CHECK18-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3536// CHECK18-NEXT: store i8* null, i8** [[TMP13]], align 8
3537// CHECK18-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3538// CHECK18-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
3539// CHECK18-NEXT: store i64 [[TMP6]], i64* [[TMP15]], align 8
3540// CHECK18-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3541// CHECK18-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i64*
3542// CHECK18-NEXT: store i64 [[TMP6]], i64* [[TMP17]], align 8
3543// CHECK18-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
3544// CHECK18-NEXT: store i8* null, i8** [[TMP18]], align 8
3545// CHECK18-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
3546// CHECK18-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i64*
3547// CHECK18-NEXT: store i64 [[TMP8]], i64* [[TMP20]], align 8
3548// CHECK18-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
3549// CHECK18-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i64*
3550// CHECK18-NEXT: store i64 [[TMP8]], i64* [[TMP22]], align 8
3551// CHECK18-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
3552// CHECK18-NEXT: store i8* null, i8** [[TMP23]], align 8
3553// CHECK18-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3554// CHECK18-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3555// CHECK18-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
3556// CHECK18-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
3557// CHECK18-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
3558// CHECK18-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
3559// CHECK18-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED3:%.*]], label [[OMP_OFFLOAD_CONT4:%.*]]
3560// CHECK18: omp_offload.failed3:
3561// CHECK18-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP8]]) #[[ATTR2]]
3562// CHECK18-NEXT: br label [[OMP_OFFLOAD_CONT4]]
3563// CHECK18: omp_offload.cont4:
3564// CHECK18-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
3565// CHECK18-NEXT: ret i32 [[TMP30]]
3566//
3567//
3568// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003569// CHECK18-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003570// CHECK18-NEXT: entry:
3571// CHECK18-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3572// CHECK18-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
3573// CHECK18-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003574// CHECK18-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003575// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3576// CHECK18-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3577// CHECK18-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3578// CHECK18-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3579// CHECK18-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3580// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
3581// CHECK18-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3582// CHECK18-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
3583// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003584// CHECK18-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
3585// CHECK18-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
3586// CHECK18-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
3587// CHECK18-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
3588// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003589// CHECK18-NEXT: ret void
3590//
3591//
3592// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003593// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003594// CHECK18-NEXT: entry:
3595// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3596// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003597// CHECK18-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3598// CHECK18-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003599// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3600// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003601// CHECK18-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3602// CHECK18-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3603// CHECK18-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3604// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
3605// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3606// CHECK18-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
3607// CHECK18-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
3608// CHECK18-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003609// CHECK18-NEXT: store double [[ADD]], double* [[A]], align 8
3610// CHECK18-NEXT: ret void
3611//
3612//
3613// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003614// CHECK18-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003615// CHECK18-NEXT: entry:
3616// CHECK18-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
3617// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3618// CHECK18-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3619// CHECK18-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3620// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003621// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003622// CHECK18-NEXT: ret void
3623//
3624//
3625// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003626// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003627// CHECK18-NEXT: entry:
3628// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3629// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003630// CHECK18-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003631// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3632// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003633// CHECK18-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
3634// CHECK18-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
3635// CHECK18-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003636// CHECK18-NEXT: store double 2.500000e+00, double* [[A]], align 8
3637// CHECK18-NEXT: ret void
3638//
3639//
3640// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003641// CHECK18-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003642// CHECK18-NEXT: entry:
3643// CHECK18-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3644// CHECK18-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
3645// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3646// CHECK18-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3647// CHECK18-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
3648// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3649// CHECK18-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
3650// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3651// CHECK18-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
3652// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003653// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003654// CHECK18-NEXT: ret void
3655//
3656//
3657// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003658// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003659// CHECK18-NEXT: entry:
3660// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3661// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3662// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3663// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3664// CHECK18-NEXT: ret void
3665//
3666//
3667// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003668// CHECK18-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003669// CHECK18-NEXT: entry:
3670// CHECK18-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3671// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3672// CHECK18-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3673// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3674// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3675// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003676// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003677// CHECK18-NEXT: ret void
3678//
3679//
3680// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003681// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003682// CHECK18-NEXT: entry:
3683// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3684// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3685// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3686// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3687// CHECK18-NEXT: ret void
3688//
3689//
3690// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04003691// CHECK18-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003692// CHECK18-NEXT: entry:
3693// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3694// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003695// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003696// CHECK18-NEXT: ret void
3697//
3698//
3699// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003700// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003701// CHECK18-NEXT: entry:
3702// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3703// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3704// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3705// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3706// CHECK18-NEXT: ret void
3707//
3708//
3709// CHECK18-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003710// CHECK18-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003711// CHECK18-NEXT: entry:
3712// CHECK18-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
3713// CHECK18-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
3714// CHECK18-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003715// CHECK18-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
3716// CHECK18-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003717// CHECK18-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3718// CHECK18-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
3719// CHECK18-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3720// CHECK18-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3721// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
3722// CHECK18-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
3723// CHECK18-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
3724// CHECK18-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
3725// CHECK18-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
3726// CHECK18-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003727// CHECK18-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
3728// CHECK18-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
3729// CHECK18-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
3730// CHECK18-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
3731// CHECK18-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
3732// CHECK18-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
3733// CHECK18-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
3734// CHECK18-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
3735// CHECK18-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003736// CHECK18-NEXT: ret void
3737//
3738//
3739// CHECK18-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003740// CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003741// CHECK18-NEXT: entry:
3742// CHECK18-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3743// CHECK18-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003744// CHECK18-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
3745// CHECK18-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003746// CHECK18-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3747// CHECK18-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003748// CHECK18-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
3749// CHECK18-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
3750// CHECK18-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
3751// CHECK18-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
3752// CHECK18-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
3753// CHECK18-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
3754// CHECK18-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3755// CHECK18-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
3756// CHECK18-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003757// CHECK18-NEXT: ret void
3758//
3759//
3760// CHECK18-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04003761// CHECK18-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003762// CHECK18-NEXT: entry:
3763// CHECK18-NEXT: call void @__tgt_register_requires(i64 1)
3764// CHECK18-NEXT: ret void
3765//
3766//
3767// CHECK19-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003768// CHECK19-SAME: (i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003769// CHECK19-NEXT: entry:
3770// CHECK19-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3771// CHECK19-NEXT: [[A:%.*]] = alloca i32, align 4
3772// CHECK19-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 4
3773// CHECK19-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3774// CHECK19-NEXT: store i32 0, i32* [[A]], align 4
3775// CHECK19-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003776// CHECK19-NEXT: [[CALL:%.*]] = call i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 4 dereferenceable(8) [[S]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003777// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
3778// CHECK19-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
3779// CHECK19-NEXT: store i32 [[ADD]], i32* [[A]], align 4
3780// CHECK19-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003781// CHECK19-NEXT: [[CALL1:%.*]] = call i32 @_ZL7fstatici(i32 [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003782// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
3783// CHECK19-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
3784// CHECK19-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
3785// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003786// CHECK19-NEXT: [[CALL3:%.*]] = call i32 @_Z9ftemplateIiET_i(i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003787// CHECK19-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
3788// CHECK19-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
3789// CHECK19-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
3790// CHECK19-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
3791// CHECK19-NEXT: ret i32 [[TMP6]]
3792//
3793//
3794// CHECK19-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003795// CHECK19-SAME: (%struct.S1* nonnull align 4 dereferenceable(8) [[THIS:%.*]], i32 [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003796// CHECK19-NEXT: entry:
3797// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
3798// CHECK19-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3799// CHECK19-NEXT: [[B:%.*]] = alloca i32, align 4
3800// CHECK19-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3801// CHECK19-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
3802// CHECK19-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
3803// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
3804// CHECK19-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
3805// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
3806// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
3807// CHECK19-NEXT: [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
3808// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
3809// CHECK19-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
3810// CHECK19-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3811// CHECK19-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
3812// CHECK19-NEXT: store i32 1, i32* [[B]], align 4
3813// CHECK19-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
3814// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
3815// CHECK19-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
3816// CHECK19-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
3817// CHECK19-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
3818// CHECK19-NEXT: store i32 [[TMP2]], i32* [[B_CASTED]], align 4
3819// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_CASTED]], align 4
3820// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3821// CHECK19-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3822// CHECK19-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3823// CHECK19-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
3824// CHECK19-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3825// CHECK19-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
3826// CHECK19-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 4
3827// CHECK19-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3828// CHECK19-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
3829// CHECK19-NEXT: store double* [[A]], double** [[TMP9]], align 4
3830// CHECK19-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
3831// CHECK19-NEXT: store i8* null, i8** [[TMP10]], align 4
3832// CHECK19-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3833// CHECK19-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
3834// CHECK19-NEXT: store i32 [[TMP3]], i32* [[TMP12]], align 4
3835// CHECK19-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3836// CHECK19-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
3837// CHECK19-NEXT: store i32 [[TMP3]], i32* [[TMP14]], align 4
3838// CHECK19-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
3839// CHECK19-NEXT: store i8* null, i8** [[TMP15]], align 4
3840// CHECK19-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
3841// CHECK19-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
3842// CHECK19-NEXT: store i32 [[TMP5]], i32* [[TMP17]], align 4
3843// CHECK19-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
3844// CHECK19-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32*
3845// CHECK19-NEXT: store i32 [[TMP5]], i32* [[TMP19]], align 4
3846// CHECK19-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
3847// CHECK19-NEXT: store i8* null, i8** [[TMP20]], align 4
3848// CHECK19-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3849// CHECK19-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3850// CHECK19-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3851// CHECK19-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
3852// CHECK19-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
3853// CHECK19-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3854// CHECK19: omp_offload.failed:
3855// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2:[0-9]+]]
3856// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT]]
3857// CHECK19: omp_offload.cont:
3858// CHECK19-NEXT: [[A2:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
3859// CHECK19-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
3860// CHECK19-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
3861// CHECK19-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 4
3862// CHECK19-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
3863// CHECK19-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
3864// CHECK19-NEXT: store double* [[A2]], double** [[TMP29]], align 4
3865// CHECK19-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
3866// CHECK19-NEXT: store i8* null, i8** [[TMP30]], align 4
3867// CHECK19-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
3868// CHECK19-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
3869// CHECK19-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
3870// CHECK19-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
3871// CHECK19-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
3872// CHECK19: omp_offload.failed6:
3873// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
3874// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT7]]
3875// CHECK19: omp_offload.cont7:
3876// CHECK19-NEXT: [[A8:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
3877// CHECK19-NEXT: [[TMP35:%.*]] = load double, double* [[A8]], align 4
3878// CHECK19-NEXT: [[CONV:%.*]] = fptosi double [[TMP35]] to i32
3879// CHECK19-NEXT: ret i32 [[CONV]]
3880//
3881//
3882// CHECK19-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003883// CHECK19-SAME: (i32 [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003884// CHECK19-NEXT: entry:
3885// CHECK19-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3886// CHECK19-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3887// CHECK19-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3888// CHECK19-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
3889// CHECK19-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i32, align 4
3890// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 4
3891// CHECK19-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 4
3892// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 4
3893// CHECK19-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4
3894// CHECK19-NEXT: [[DOTCAPTURE_EXPR__CASTED4:%.*]] = alloca i32, align 4
3895// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 4
3896// CHECK19-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 4
3897// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 4
3898// CHECK19-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3899// CHECK19-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
3900// CHECK19-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
3901// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
3902// CHECK19-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
3903// CHECK19-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3904// CHECK19-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3905// CHECK19-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3906// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3907// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3908// CHECK19-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
3909// CHECK19-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
3910// CHECK19-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3911// CHECK19-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
3912// CHECK19-NEXT: store i32 [[TMP3]], i32* [[TMP7]], align 4
3913// CHECK19-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3914// CHECK19-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
3915// CHECK19-NEXT: store i32 [[TMP3]], i32* [[TMP9]], align 4
3916// CHECK19-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
3917// CHECK19-NEXT: store i8* null, i8** [[TMP10]], align 4
3918// CHECK19-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3919// CHECK19-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
3920// CHECK19-NEXT: store i32 [[TMP5]], i32* [[TMP12]], align 4
3921// CHECK19-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3922// CHECK19-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
3923// CHECK19-NEXT: store i32 [[TMP5]], i32* [[TMP14]], align 4
3924// CHECK19-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
3925// CHECK19-NEXT: store i8* null, i8** [[TMP15]], align 4
3926// CHECK19-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3927// CHECK19-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3928// CHECK19-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3929// CHECK19-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3930// CHECK19-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
3931// CHECK19-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
3932// CHECK19-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3933// CHECK19: omp_offload.failed:
3934// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2]]
3935// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT]]
3936// CHECK19: omp_offload.cont:
3937// CHECK19-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
3938// CHECK19-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
3939// CHECK19-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_3]], align 4
3940// CHECK19-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
3941// CHECK19-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
3942// CHECK19-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
3943// CHECK19-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
3944// CHECK19-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i32*
3945// CHECK19-NEXT: store i32 [[TMP24]], i32* [[TMP26]], align 4
3946// CHECK19-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
3947// CHECK19-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i32*
3948// CHECK19-NEXT: store i32 [[TMP24]], i32* [[TMP28]], align 4
3949// CHECK19-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0
3950// CHECK19-NEXT: store i8* null, i8** [[TMP29]], align 4
3951// CHECK19-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
3952// CHECK19-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
3953// CHECK19-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
3954// CHECK19-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
3955// CHECK19-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
3956// CHECK19-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
3957// CHECK19: omp_offload.failed8:
3958// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i32 [[TMP24]]) #[[ATTR2]]
3959// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT9]]
3960// CHECK19: omp_offload.cont9:
3961// CHECK19-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
3962// CHECK19-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP35]], 1
3963// CHECK19-NEXT: ret i32 [[ADD10]]
3964//
3965//
3966// CHECK19-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003967// CHECK19-SAME: (i32 [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003968// CHECK19-NEXT: entry:
3969// CHECK19-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
3970// CHECK19-NEXT: [[A:%.*]] = alloca i32, align 4
3971// CHECK19-NEXT: [[B:%.*]] = alloca i16, align 2
3972// CHECK19-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
3973// CHECK19-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
3974// CHECK19-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
3975// CHECK19-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
3976// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
3977// CHECK19-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
3978// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
3979// CHECK19-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
3980// CHECK19-NEXT: store i32 0, i32* [[A]], align 4
3981// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
3982// CHECK19-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
3983// CHECK19-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3984// CHECK19: omp_offload.failed:
3985// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
3986// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT]]
3987// CHECK19: omp_offload.cont:
3988// CHECK19-NEXT: store i16 1, i16* [[B]], align 2
3989// CHECK19-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
3990// CHECK19-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
3991// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
3992// CHECK19-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
3993// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
3994// CHECK19-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
3995// CHECK19-NEXT: [[CONV:%.*]] = bitcast i32* [[B_CASTED]] to i16*
3996// CHECK19-NEXT: store i16 [[TMP5]], i16* [[CONV]], align 2
3997// CHECK19-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
3998// CHECK19-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
3999// CHECK19-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__CASTED]] to i16*
4000// CHECK19-NEXT: store i16 [[TMP7]], i16* [[CONV1]], align 2
4001// CHECK19-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4002// CHECK19-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4003// CHECK19-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
4004// CHECK19-NEXT: store i32 [[TMP4]], i32* [[TMP10]], align 4
4005// CHECK19-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4006// CHECK19-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
4007// CHECK19-NEXT: store i32 [[TMP4]], i32* [[TMP12]], align 4
4008// CHECK19-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4009// CHECK19-NEXT: store i8* null, i8** [[TMP13]], align 4
4010// CHECK19-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4011// CHECK19-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
4012// CHECK19-NEXT: store i32 [[TMP6]], i32* [[TMP15]], align 4
4013// CHECK19-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4014// CHECK19-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
4015// CHECK19-NEXT: store i32 [[TMP6]], i32* [[TMP17]], align 4
4016// CHECK19-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
4017// CHECK19-NEXT: store i8* null, i8** [[TMP18]], align 4
4018// CHECK19-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
4019// CHECK19-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32*
4020// CHECK19-NEXT: store i32 [[TMP8]], i32* [[TMP20]], align 4
4021// CHECK19-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
4022// CHECK19-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32*
4023// CHECK19-NEXT: store i32 [[TMP8]], i32* [[TMP22]], align 4
4024// CHECK19-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
4025// CHECK19-NEXT: store i8* null, i8** [[TMP23]], align 4
4026// CHECK19-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4027// CHECK19-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4028// CHECK19-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
4029// CHECK19-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
4030// CHECK19-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
4031// CHECK19-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
4032// CHECK19-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED2:%.*]], label [[OMP_OFFLOAD_CONT3:%.*]]
4033// CHECK19: omp_offload.failed2:
4034// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i32 [[TMP4]], i32 [[TMP6]], i32 [[TMP8]]) #[[ATTR2]]
4035// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT3]]
4036// CHECK19: omp_offload.cont3:
4037// CHECK19-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
4038// CHECK19-NEXT: ret i32 [[TMP30]]
4039//
4040//
4041// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004042// CHECK19-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004043// CHECK19-NEXT: entry:
4044// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4045// CHECK19-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
4046// CHECK19-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004047// CHECK19-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004048// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4049// CHECK19-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4050// CHECK19-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4051// CHECK19-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4052// CHECK19-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4053// CHECK19-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4054// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004055// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
4056// CHECK19-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
4057// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
4058// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004059// CHECK19-NEXT: ret void
4060//
4061//
4062// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004063// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004064// CHECK19-NEXT: entry:
4065// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4066// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004067// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4068// CHECK19-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004069// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4070// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004071// CHECK19-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4072// CHECK19-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4073// CHECK19-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4074// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
4075// CHECK19-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004076// CHECK19-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004077// CHECK19-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004078// CHECK19-NEXT: store double [[ADD]], double* [[A]], align 4
4079// CHECK19-NEXT: ret void
4080//
4081//
4082// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004083// CHECK19-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004084// CHECK19-NEXT: entry:
4085// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4086// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4087// CHECK19-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4088// CHECK19-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4089// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004090// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004091// CHECK19-NEXT: ret void
4092//
4093//
4094// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004095// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004096// CHECK19-NEXT: entry:
4097// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4098// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004099// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004100// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4101// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004102// CHECK19-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4103// CHECK19-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4104// CHECK19-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004105// CHECK19-NEXT: store double 2.500000e+00, double* [[A]], align 4
4106// CHECK19-NEXT: ret void
4107//
4108//
4109// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004110// CHECK19-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004111// CHECK19-NEXT: entry:
4112// CHECK19-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
4113// CHECK19-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
4114// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4115// CHECK19-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4116// CHECK19-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
4117// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4118// CHECK19-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
4119// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004120// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004121// CHECK19-NEXT: ret void
4122//
4123//
4124// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004125// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004126// CHECK19-NEXT: entry:
4127// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4128// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4129// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4130// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4131// CHECK19-NEXT: ret void
4132//
4133//
4134// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004135// CHECK19-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004136// CHECK19-NEXT: entry:
4137// CHECK19-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
4138// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4139// CHECK19-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4140// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4141// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004142// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004143// CHECK19-NEXT: ret void
4144//
4145//
4146// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004147// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004148// CHECK19-NEXT: entry:
4149// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4150// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4151// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4152// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4153// CHECK19-NEXT: ret void
4154//
4155//
4156// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04004157// CHECK19-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004158// CHECK19-NEXT: entry:
4159// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4160// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004161// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004162// CHECK19-NEXT: ret void
4163//
4164//
4165// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004166// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004167// CHECK19-NEXT: entry:
4168// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4169// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4170// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4171// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4172// CHECK19-NEXT: ret void
4173//
4174//
4175// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004176// CHECK19-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004177// CHECK19-NEXT: entry:
4178// CHECK19-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4179// CHECK19-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
4180// CHECK19-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004181// CHECK19-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4182// CHECK19-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004183// CHECK19-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4184// CHECK19-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
4185// CHECK19-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4186// CHECK19-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4187// CHECK19-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
4188// CHECK19-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
4189// CHECK19-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
4190// CHECK19-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
4191// CHECK19-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004192// CHECK19-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
4193// CHECK19-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
4194// CHECK19-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
4195// CHECK19-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
4196// CHECK19-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
4197// CHECK19-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
4198// CHECK19-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
4199// CHECK19-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004200// CHECK19-NEXT: ret void
4201//
4202//
4203// CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004204// CHECK19-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004205// CHECK19-NEXT: entry:
4206// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4207// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004208// CHECK19-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4209// CHECK19-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004210// CHECK19-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4211// CHECK19-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004212// CHECK19-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
4213// CHECK19-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4214// CHECK19-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
4215// CHECK19-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
4216// CHECK19-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
4217// CHECK19-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
4218// CHECK19-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
4219// CHECK19-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004220// CHECK19-NEXT: ret void
4221//
4222//
4223// CHECK19-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04004224// CHECK19-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004225// CHECK19-NEXT: entry:
4226// CHECK19-NEXT: call void @__tgt_register_requires(i64 1)
4227// CHECK19-NEXT: ret void
4228//
4229//
4230// CHECK20-LABEL: define {{[^@]+}}@_Z3bari
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004231// CHECK20-SAME: (i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004232// CHECK20-NEXT: entry:
4233// CHECK20-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
4234// CHECK20-NEXT: [[A:%.*]] = alloca i32, align 4
4235// CHECK20-NEXT: [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 4
4236// CHECK20-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
4237// CHECK20-NEXT: store i32 0, i32* [[A]], align 4
4238// CHECK20-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004239// CHECK20-NEXT: [[CALL:%.*]] = call i32 @_ZN2S12r1Ei(%struct.S1* nonnull align 4 dereferenceable(8) [[S]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004240// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[A]], align 4
4241// CHECK20-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CALL]]
4242// CHECK20-NEXT: store i32 [[ADD]], i32* [[A]], align 4
4243// CHECK20-NEXT: [[TMP2:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004244// CHECK20-NEXT: [[CALL1:%.*]] = call i32 @_ZL7fstatici(i32 [[TMP2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004245// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
4246// CHECK20-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], [[CALL1]]
4247// CHECK20-NEXT: store i32 [[ADD2]], i32* [[A]], align 4
4248// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[N_ADDR]], align 4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004249// CHECK20-NEXT: [[CALL3:%.*]] = call i32 @_Z9ftemplateIiET_i(i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004250// CHECK20-NEXT: [[TMP5:%.*]] = load i32, i32* [[A]], align 4
4251// CHECK20-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP5]], [[CALL3]]
4252// CHECK20-NEXT: store i32 [[ADD4]], i32* [[A]], align 4
4253// CHECK20-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4
4254// CHECK20-NEXT: ret i32 [[TMP6]]
4255//
4256//
4257// CHECK20-LABEL: define {{[^@]+}}@_ZN2S12r1Ei
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004258// CHECK20-SAME: (%struct.S1* nonnull align 4 dereferenceable(8) [[THIS:%.*]], i32 [[N:%.*]]) #[[ATTR0]] comdat align 2 {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004259// CHECK20-NEXT: entry:
4260// CHECK20-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4261// CHECK20-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
4262// CHECK20-NEXT: [[B:%.*]] = alloca i32, align 4
4263// CHECK20-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4264// CHECK20-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
4265// CHECK20-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
4266// CHECK20-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
4267// CHECK20-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
4268// CHECK20-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
4269// CHECK20-NEXT: [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
4270// CHECK20-NEXT: [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
4271// CHECK20-NEXT: [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
4272// CHECK20-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4273// CHECK20-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
4274// CHECK20-NEXT: [[THIS1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4275// CHECK20-NEXT: store i32 1, i32* [[B]], align 4
4276// CHECK20-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
4277// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4
4278// CHECK20-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]]
4279// CHECK20-NEXT: store i32 [[SUB]], i32* [[DOTCAPTURE_EXPR_]], align 4
4280// CHECK20-NEXT: [[TMP2:%.*]] = load i32, i32* [[B]], align 4
4281// CHECK20-NEXT: store i32 [[TMP2]], i32* [[B_CASTED]], align 4
4282// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_CASTED]], align 4
4283// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4284// CHECK20-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4285// CHECK20-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4286// CHECK20-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[THIS1]], i32 0, i32 0
4287// CHECK20-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4288// CHECK20-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to %struct.S1**
4289// CHECK20-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP7]], align 4
4290// CHECK20-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4291// CHECK20-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to double**
4292// CHECK20-NEXT: store double* [[A]], double** [[TMP9]], align 4
4293// CHECK20-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4294// CHECK20-NEXT: store i8* null, i8** [[TMP10]], align 4
4295// CHECK20-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4296// CHECK20-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
4297// CHECK20-NEXT: store i32 [[TMP3]], i32* [[TMP12]], align 4
4298// CHECK20-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4299// CHECK20-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
4300// CHECK20-NEXT: store i32 [[TMP3]], i32* [[TMP14]], align 4
4301// CHECK20-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
4302// CHECK20-NEXT: store i8* null, i8** [[TMP15]], align 4
4303// CHECK20-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
4304// CHECK20-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
4305// CHECK20-NEXT: store i32 [[TMP5]], i32* [[TMP17]], align 4
4306// CHECK20-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
4307// CHECK20-NEXT: [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32*
4308// CHECK20-NEXT: store i32 [[TMP5]], i32* [[TMP19]], align 4
4309// CHECK20-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
4310// CHECK20-NEXT: store i8* null, i8** [[TMP20]], align 4
4311// CHECK20-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4312// CHECK20-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4313// CHECK20-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4314// CHECK20-NEXT: [[TMP24:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121.region_id, i32 3, i8** [[TMP21]], i8** [[TMP22]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP23]])
4315// CHECK20-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
4316// CHECK20-NEXT: br i1 [[TMP25]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4317// CHECK20: omp_offload.failed:
4318// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121(%struct.S1* [[THIS1]], i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2:[0-9]+]]
4319// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT]]
4320// CHECK20: omp_offload.cont:
4321// CHECK20-NEXT: [[A2:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
4322// CHECK20-NEXT: [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
4323// CHECK20-NEXT: [[TMP27:%.*]] = bitcast i8** [[TMP26]] to %struct.S1**
4324// CHECK20-NEXT: store %struct.S1* [[THIS1]], %struct.S1** [[TMP27]], align 4
4325// CHECK20-NEXT: [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
4326// CHECK20-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to double**
4327// CHECK20-NEXT: store double* [[A2]], double** [[TMP29]], align 4
4328// CHECK20-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
4329// CHECK20-NEXT: store i8* null, i8** [[TMP30]], align 4
4330// CHECK20-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
4331// CHECK20-NEXT: [[TMP32:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
4332// CHECK20-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126.region_id, i32 1, i8** [[TMP31]], i8** [[TMP32]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.2, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.3, i32 0, i32 0), i8** null, i8** null, i32 0, i32 1024)
4333// CHECK20-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
4334// CHECK20-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
4335// CHECK20: omp_offload.failed6:
4336// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126(%struct.S1* [[THIS1]]) #[[ATTR2]]
4337// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT7]]
4338// CHECK20: omp_offload.cont7:
4339// CHECK20-NEXT: [[A8:%.*]] = getelementptr inbounds [[STRUCT_S1]], %struct.S1* [[THIS1]], i32 0, i32 0
4340// CHECK20-NEXT: [[TMP35:%.*]] = load double, double* [[A8]], align 4
4341// CHECK20-NEXT: [[CONV:%.*]] = fptosi double [[TMP35]] to i32
4342// CHECK20-NEXT: ret i32 [[CONV]]
4343//
4344//
4345// CHECK20-LABEL: define {{[^@]+}}@_ZL7fstatici
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004346// CHECK20-SAME: (i32 [[N:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004347// CHECK20-NEXT: entry:
4348// CHECK20-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
4349// CHECK20-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4350// CHECK20-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4351// CHECK20-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
4352// CHECK20-NEXT: [[DOTCAPTURE_EXPR__CASTED2:%.*]] = alloca i32, align 4
4353// CHECK20-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [2 x i8*], align 4
4354// CHECK20-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [2 x i8*], align 4
4355// CHECK20-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [2 x i8*], align 4
4356// CHECK20-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4
4357// CHECK20-NEXT: [[DOTCAPTURE_EXPR__CASTED4:%.*]] = alloca i32, align 4
4358// CHECK20-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 4
4359// CHECK20-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 4
4360// CHECK20-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 4
4361// CHECK20-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
4362// CHECK20-NEXT: [[TMP0:%.*]] = load i32, i32* [[N_ADDR]], align 4
4363// CHECK20-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4
4364// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[N_ADDR]], align 4
4365// CHECK20-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 32
4366// CHECK20-NEXT: store i32 [[MUL]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4367// CHECK20-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4368// CHECK20-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4369// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4370// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4371// CHECK20-NEXT: store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
4372// CHECK20-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED2]], align 4
4373// CHECK20-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4374// CHECK20-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
4375// CHECK20-NEXT: store i32 [[TMP3]], i32* [[TMP7]], align 4
4376// CHECK20-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4377// CHECK20-NEXT: [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
4378// CHECK20-NEXT: store i32 [[TMP3]], i32* [[TMP9]], align 4
4379// CHECK20-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4380// CHECK20-NEXT: store i8* null, i8** [[TMP10]], align 4
4381// CHECK20-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4382// CHECK20-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
4383// CHECK20-NEXT: store i32 [[TMP5]], i32* [[TMP12]], align 4
4384// CHECK20-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4385// CHECK20-NEXT: [[TMP14:%.*]] = bitcast i8** [[TMP13]] to i32*
4386// CHECK20-NEXT: store i32 [[TMP5]], i32* [[TMP14]], align 4
4387// CHECK20-NEXT: [[TMP15:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
4388// CHECK20-NEXT: store i8* null, i8** [[TMP15]], align 4
4389// CHECK20-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4390// CHECK20-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4391// CHECK20-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4392// CHECK20-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4393// CHECK20-NEXT: [[TMP20:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104.region_id, i32 2, i8** [[TMP16]], i8** [[TMP17]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.5, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.6, i32 0, i32 0), i8** null, i8** null, i32 [[TMP18]], i32 [[TMP19]])
4394// CHECK20-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
4395// CHECK20-NEXT: br i1 [[TMP21]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4396// CHECK20: omp_offload.failed:
4397// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104(i32 [[TMP3]], i32 [[TMP5]]) #[[ATTR2]]
4398// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT]]
4399// CHECK20: omp_offload.cont:
4400// CHECK20-NEXT: [[TMP22:%.*]] = load i32, i32* [[N_ADDR]], align 4
4401// CHECK20-NEXT: [[ADD:%.*]] = add nsw i32 32, [[TMP22]]
4402// CHECK20-NEXT: store i32 [[ADD]], i32* [[DOTCAPTURE_EXPR_3]], align 4
4403// CHECK20-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
4404// CHECK20-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
4405// CHECK20-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED4]], align 4
4406// CHECK20-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4407// CHECK20-NEXT: [[TMP26:%.*]] = bitcast i8** [[TMP25]] to i32*
4408// CHECK20-NEXT: store i32 [[TMP24]], i32* [[TMP26]], align 4
4409// CHECK20-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4410// CHECK20-NEXT: [[TMP28:%.*]] = bitcast i8** [[TMP27]] to i32*
4411// CHECK20-NEXT: store i32 [[TMP24]], i32* [[TMP28]], align 4
4412// CHECK20-NEXT: [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0
4413// CHECK20-NEXT: store i8* null, i8** [[TMP29]], align 4
4414// CHECK20-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4415// CHECK20-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4416// CHECK20-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4
4417// CHECK20-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108.region_id, i32 1, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 [[TMP32]])
4418// CHECK20-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0
4419// CHECK20-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
4420// CHECK20: omp_offload.failed8:
4421// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108(i32 [[TMP24]]) #[[ATTR2]]
4422// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT9]]
4423// CHECK20: omp_offload.cont9:
4424// CHECK20-NEXT: [[TMP35:%.*]] = load i32, i32* [[N_ADDR]], align 4
4425// CHECK20-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP35]], 1
4426// CHECK20-NEXT: ret i32 [[ADD10]]
4427//
4428//
4429// CHECK20-LABEL: define {{[^@]+}}@_Z9ftemplateIiET_i
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004430// CHECK20-SAME: (i32 [[N:%.*]]) #[[ATTR0]] comdat {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004431// CHECK20-NEXT: entry:
4432// CHECK20-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
4433// CHECK20-NEXT: [[A:%.*]] = alloca i32, align 4
4434// CHECK20-NEXT: [[B:%.*]] = alloca i16, align 2
4435// CHECK20-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i16, align 2
4436// CHECK20-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4437// CHECK20-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
4438// CHECK20-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
4439// CHECK20-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
4440// CHECK20-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
4441// CHECK20-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
4442// CHECK20-NEXT: store i32 [[N]], i32* [[N_ADDR]], align 4
4443// CHECK20-NEXT: store i32 0, i32* [[A]], align 4
4444// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88.region_id, i32 0, i8** null, i8** null, i64* null, i64* null, i8** null, i8** null, i32 0, i32 20)
4445// CHECK20-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
4446// CHECK20-NEXT: br i1 [[TMP1]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4447// CHECK20: omp_offload.failed:
4448// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88() #[[ATTR2]]
4449// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT]]
4450// CHECK20: omp_offload.cont:
4451// CHECK20-NEXT: store i16 1, i16* [[B]], align 2
4452// CHECK20-NEXT: [[TMP2:%.*]] = load i16, i16* [[B]], align 2
4453// CHECK20-NEXT: store i16 [[TMP2]], i16* [[DOTCAPTURE_EXPR_]], align 2
4454// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
4455// CHECK20-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
4456// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
4457// CHECK20-NEXT: [[TMP5:%.*]] = load i16, i16* [[B]], align 2
4458// CHECK20-NEXT: [[CONV:%.*]] = bitcast i32* [[B_CASTED]] to i16*
4459// CHECK20-NEXT: store i16 [[TMP5]], i16* [[CONV]], align 2
4460// CHECK20-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
4461// CHECK20-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
4462// CHECK20-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__CASTED]] to i16*
4463// CHECK20-NEXT: store i16 [[TMP7]], i16* [[CONV1]], align 2
4464// CHECK20-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4465// CHECK20-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4466// CHECK20-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
4467// CHECK20-NEXT: store i32 [[TMP4]], i32* [[TMP10]], align 4
4468// CHECK20-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4469// CHECK20-NEXT: [[TMP12:%.*]] = bitcast i8** [[TMP11]] to i32*
4470// CHECK20-NEXT: store i32 [[TMP4]], i32* [[TMP12]], align 4
4471// CHECK20-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4472// CHECK20-NEXT: store i8* null, i8** [[TMP13]], align 4
4473// CHECK20-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4474// CHECK20-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
4475// CHECK20-NEXT: store i32 [[TMP6]], i32* [[TMP15]], align 4
4476// CHECK20-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4477// CHECK20-NEXT: [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32*
4478// CHECK20-NEXT: store i32 [[TMP6]], i32* [[TMP17]], align 4
4479// CHECK20-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
4480// CHECK20-NEXT: store i8* null, i8** [[TMP18]], align 4
4481// CHECK20-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
4482// CHECK20-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32*
4483// CHECK20-NEXT: store i32 [[TMP8]], i32* [[TMP20]], align 4
4484// CHECK20-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
4485// CHECK20-NEXT: [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32*
4486// CHECK20-NEXT: store i32 [[TMP8]], i32* [[TMP22]], align 4
4487// CHECK20-NEXT: [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
4488// CHECK20-NEXT: store i8* null, i8** [[TMP23]], align 4
4489// CHECK20-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4490// CHECK20-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4491// CHECK20-NEXT: [[TMP26:%.*]] = load i16, i16* [[DOTCAPTURE_EXPR_]], align 2
4492// CHECK20-NEXT: [[TMP27:%.*]] = sext i16 [[TMP26]] to i32
4493// CHECK20-NEXT: [[TMP28:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_sizes.12, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i8** null, i8** null, i32 [[TMP27]], i32 1024)
4494// CHECK20-NEXT: [[TMP29:%.*]] = icmp ne i32 [[TMP28]], 0
4495// CHECK20-NEXT: br i1 [[TMP29]], label [[OMP_OFFLOAD_FAILED2:%.*]], label [[OMP_OFFLOAD_CONT3:%.*]]
4496// CHECK20: omp_offload.failed2:
4497// CHECK20-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93(i32 [[TMP4]], i32 [[TMP6]], i32 [[TMP8]]) #[[ATTR2]]
4498// CHECK20-NEXT: br label [[OMP_OFFLOAD_CONT3]]
4499// CHECK20: omp_offload.cont3:
4500// CHECK20-NEXT: [[TMP30:%.*]] = load i32, i32* [[A]], align 4
4501// CHECK20-NEXT: ret i32 [[TMP30]]
4502//
4503//
4504// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004505// CHECK20-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004506// CHECK20-NEXT: entry:
4507// CHECK20-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4508// CHECK20-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
4509// CHECK20-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004510// CHECK20-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004511// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4512// CHECK20-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4513// CHECK20-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4514// CHECK20-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4515// CHECK20-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4516// CHECK20-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4517// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004518// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
4519// CHECK20-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
4520// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
4521// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004522// CHECK20-NEXT: ret void
4523//
4524//
4525// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004526// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004527// CHECK20-NEXT: entry:
4528// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4529// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004530// CHECK20-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4531// CHECK20-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004532// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4533// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004534// CHECK20-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4535// CHECK20-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4536// CHECK20-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4537// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
4538// CHECK20-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004539// CHECK20-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004540// CHECK20-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004541// CHECK20-NEXT: store double [[ADD]], double* [[A]], align 4
4542// CHECK20-NEXT: ret void
4543//
4544//
4545// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004546// CHECK20-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004547// CHECK20-NEXT: entry:
4548// CHECK20-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
4549// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4550// CHECK20-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4551// CHECK20-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4552// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004553// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004554// CHECK20-NEXT: ret void
4555//
4556//
4557// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004558// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004559// CHECK20-NEXT: entry:
4560// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4561// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004562// CHECK20-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004563// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4564// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004565// CHECK20-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
4566// CHECK20-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
4567// CHECK20-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004568// CHECK20-NEXT: store double 2.500000e+00, double* [[A]], align 4
4569// CHECK20-NEXT: ret void
4570//
4571//
4572// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004573// CHECK20-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004574// CHECK20-NEXT: entry:
4575// CHECK20-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
4576// CHECK20-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
4577// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4578// CHECK20-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4579// CHECK20-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
4580// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4581// CHECK20-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
4582// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004583// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004584// CHECK20-NEXT: ret void
4585//
4586//
4587// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004588// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004589// CHECK20-NEXT: entry:
4590// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4591// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4592// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4593// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4594// CHECK20-NEXT: ret void
4595//
4596//
4597// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004598// CHECK20-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004599// CHECK20-NEXT: entry:
4600// CHECK20-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
4601// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4602// CHECK20-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4603// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4604// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004605// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004606// CHECK20-NEXT: ret void
4607//
4608//
4609// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined..7
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004610// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004611// CHECK20-NEXT: entry:
4612// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4613// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4614// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4615// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4616// CHECK20-NEXT: ret void
4617//
4618//
4619// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04004620// CHECK20-SAME: () #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004621// CHECK20-NEXT: entry:
4622// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4623// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004624// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004625// CHECK20-NEXT: ret void
4626//
4627//
4628// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined..10
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004629// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004630// CHECK20-NEXT: entry:
4631// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4632// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4633// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4634// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4635// CHECK20-NEXT: ret void
4636//
4637//
4638// CHECK20-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004639// CHECK20-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR3]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004640// CHECK20-NEXT: entry:
4641// CHECK20-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4642// CHECK20-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
4643// CHECK20-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004644// CHECK20-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4645// CHECK20-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004646// CHECK20-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4647// CHECK20-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
4648// CHECK20-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4649// CHECK20-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4650// CHECK20-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
4651// CHECK20-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
4652// CHECK20-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
4653// CHECK20-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
4654// CHECK20-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004655// CHECK20-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
4656// CHECK20-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
4657// CHECK20-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
4658// CHECK20-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
4659// CHECK20-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
4660// CHECK20-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
4661// CHECK20-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
4662// CHECK20-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004663// CHECK20-NEXT: ret void
4664//
4665//
4666// CHECK20-LABEL: define {{[^@]+}}@.omp_outlined..11
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004667// CHECK20-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004668// CHECK20-NEXT: entry:
4669// CHECK20-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4670// CHECK20-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004671// CHECK20-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4672// CHECK20-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004673// CHECK20-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4674// CHECK20-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004675// CHECK20-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
4676// CHECK20-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
4677// CHECK20-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
4678// CHECK20-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
4679// CHECK20-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
4680// CHECK20-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
4681// CHECK20-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
4682// CHECK20-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004683// CHECK20-NEXT: ret void
4684//
4685//
4686// CHECK20-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04004687// CHECK20-SAME: () #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004688// CHECK20-NEXT: entry:
4689// CHECK20-NEXT: call void @__tgt_register_requires(i64 1)
4690// CHECK20-NEXT: ret void
4691//
4692//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004693// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004694// CHECK25-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004695// CHECK25-NEXT: entry:
4696// CHECK25-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4697// CHECK25-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
4698// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
4699// CHECK25-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4700// CHECK25-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
4701// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4702// CHECK25-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
4703// CHECK25-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4704// CHECK25-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
4705// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004706// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004707// CHECK25-NEXT: ret void
4708//
4709//
4710// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004711// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004712// CHECK25-NEXT: entry:
4713// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4714// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4715// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4716// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4717// CHECK25-NEXT: ret void
4718//
4719//
4720// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004721// CHECK25-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004722// CHECK25-NEXT: entry:
4723// CHECK25-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4724// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4725// CHECK25-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4726// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4727// CHECK25-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4728// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004729// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004730// CHECK25-NEXT: ret void
4731//
4732//
4733// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004734// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004735// CHECK25-NEXT: entry:
4736// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4737// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4738// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4739// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4740// CHECK25-NEXT: ret void
4741//
4742//
4743// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004744// CHECK25-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004745// CHECK25-NEXT: entry:
4746// CHECK25-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4747// CHECK25-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
4748// CHECK25-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004749// CHECK25-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004750// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4751// CHECK25-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4752// CHECK25-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4753// CHECK25-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4754// CHECK25-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4755// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
4756// CHECK25-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4757// CHECK25-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
4758// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004759// CHECK25-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
4760// CHECK25-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
4761// CHECK25-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
4762// CHECK25-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
4763// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004764// CHECK25-NEXT: ret void
4765//
4766//
4767// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004768// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004769// CHECK25-NEXT: entry:
4770// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4771// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004772// CHECK25-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4773// CHECK25-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004774// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4775// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004776// CHECK25-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4777// CHECK25-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4778// CHECK25-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4779// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
4780// CHECK25-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4781// CHECK25-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
4782// CHECK25-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
4783// CHECK25-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004784// CHECK25-NEXT: store double [[ADD]], double* [[A]], align 8
4785// CHECK25-NEXT: ret void
4786//
4787//
4788// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004789// CHECK25-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004790// CHECK25-NEXT: entry:
4791// CHECK25-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4792// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4793// CHECK25-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4794// CHECK25-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4795// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004796// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004797// CHECK25-NEXT: ret void
4798//
4799//
4800// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004801// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004802// CHECK25-NEXT: entry:
4803// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4804// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004805// CHECK25-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004806// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4807// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004808// CHECK25-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4809// CHECK25-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4810// CHECK25-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004811// CHECK25-NEXT: store double 2.500000e+00, double* [[A]], align 8
4812// CHECK25-NEXT: ret void
4813//
4814//
4815// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04004816// CHECK25-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004817// CHECK25-NEXT: entry:
4818// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4819// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004820// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004821// CHECK25-NEXT: ret void
4822//
4823//
4824// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004825// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004826// CHECK25-NEXT: entry:
4827// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4828// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4829// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4830// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4831// CHECK25-NEXT: ret void
4832//
4833//
4834// CHECK25-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004835// CHECK25-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004836// CHECK25-NEXT: entry:
4837// CHECK25-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
4838// CHECK25-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
4839// CHECK25-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004840// CHECK25-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
4841// CHECK25-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004842// CHECK25-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4843// CHECK25-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
4844// CHECK25-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4845// CHECK25-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4846// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
4847// CHECK25-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
4848// CHECK25-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
4849// CHECK25-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
4850// CHECK25-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
4851// CHECK25-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004852// CHECK25-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
4853// CHECK25-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
4854// CHECK25-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
4855// CHECK25-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
4856// CHECK25-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
4857// CHECK25-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
4858// CHECK25-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
4859// CHECK25-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
4860// CHECK25-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004861// CHECK25-NEXT: ret void
4862//
4863//
4864// CHECK25-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004865// CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004866// CHECK25-NEXT: entry:
4867// CHECK25-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4868// CHECK25-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004869// CHECK25-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
4870// CHECK25-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004871// CHECK25-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4872// CHECK25-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004873// CHECK25-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
4874// CHECK25-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4875// CHECK25-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
4876// CHECK25-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
4877// CHECK25-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
4878// CHECK25-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
4879// CHECK25-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4880// CHECK25-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
4881// CHECK25-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004882// CHECK25-NEXT: ret void
4883//
4884//
4885// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004886// CHECK26-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]], i64 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004887// CHECK26-NEXT: entry:
4888// CHECK26-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4889// CHECK26-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i64, align 8
4890// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
4891// CHECK26-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4892// CHECK26-NEXT: store i64 [[DOTCAPTURE_EXPR_1]], i64* [[DOTCAPTURE_EXPR__ADDR2]], align 8
4893// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4894// CHECK26-NEXT: [[CONV3:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR2]] to i32*
4895// CHECK26-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4896// CHECK26-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV3]], align 8
4897// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004898// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004899// CHECK26-NEXT: ret void
4900//
4901//
4902// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004903// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004904// CHECK26-NEXT: entry:
4905// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4906// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4907// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4908// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4909// CHECK26-NEXT: ret void
4910//
4911//
4912// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004913// CHECK26-SAME: (i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004914// CHECK26-NEXT: entry:
4915// CHECK26-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4916// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4917// CHECK26-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4918// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4919// CHECK26-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4920// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004921// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004922// CHECK26-NEXT: ret void
4923//
4924//
4925// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004926// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004927// CHECK26-NEXT: entry:
4928// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4929// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4930// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4931// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4932// CHECK26-NEXT: ret void
4933//
4934//
4935// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004936// CHECK26-SAME: (%struct.S1* [[THIS:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004937// CHECK26-NEXT: entry:
4938// CHECK26-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4939// CHECK26-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
4940// CHECK26-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004941// CHECK26-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004942// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4943// CHECK26-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4944// CHECK26-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4945// CHECK26-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4946// CHECK26-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4947// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
4948// CHECK26-NEXT: [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4949// CHECK26-NEXT: [[TMP2:%.*]] = load i32, i32* [[CONV1]], align 8
4950// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004951// CHECK26-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
4952// CHECK26-NEXT: [[CONV2:%.*]] = bitcast i64* [[B_CASTED]] to i32*
4953// CHECK26-NEXT: store i32 [[TMP3]], i32* [[CONV2]], align 4
4954// CHECK26-NEXT: [[TMP4:%.*]] = load i64, i64* [[B_CASTED]], align 8
4955// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i64)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i64 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004956// CHECK26-NEXT: ret void
4957//
4958//
4959// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004960// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004961// CHECK26-NEXT: entry:
4962// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4963// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004964// CHECK26-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4965// CHECK26-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004966// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4967// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004968// CHECK26-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4969// CHECK26-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
4970// CHECK26-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4971// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[B_ADDR]] to i32*
4972// CHECK26-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
4973// CHECK26-NEXT: [[CONV1:%.*]] = sitofp i32 [[TMP1]] to double
4974// CHECK26-NEXT: [[ADD:%.*]] = fadd double [[CONV1]], 1.500000e+00
4975// CHECK26-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004976// CHECK26-NEXT: store double [[ADD]], double* [[A]], align 8
4977// CHECK26-NEXT: ret void
4978//
4979//
4980// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004981// CHECK26-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004982// CHECK26-NEXT: entry:
4983// CHECK26-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
4984// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4985// CHECK26-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
4986// CHECK26-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
4987// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004988// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004989// CHECK26-NEXT: ret void
4990//
4991//
4992// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004993// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004994// CHECK26-NEXT: entry:
4995// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4996// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004997// CHECK26-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004998// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4999// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005000// CHECK26-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 8
5001// CHECK26-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 8
5002// CHECK26-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005003// CHECK26-NEXT: store double 2.500000e+00, double* [[A]], align 8
5004// CHECK26-NEXT: ret void
5005//
5006//
5007// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04005008// CHECK26-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005009// CHECK26-NEXT: entry:
5010// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5011// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005012// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005013// CHECK26-NEXT: ret void
5014//
5015//
5016// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005017// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005018// CHECK26-NEXT: entry:
5019// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5020// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5021// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5022// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5023// CHECK26-NEXT: ret void
5024//
5025//
5026// CHECK26-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005027// CHECK26-SAME: (i64 [[A:%.*]], i64 [[B:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005028// CHECK26-NEXT: entry:
5029// CHECK26-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
5030// CHECK26-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
5031// CHECK26-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005032// CHECK26-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
5033// CHECK26-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005034// CHECK26-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5035// CHECK26-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
5036// CHECK26-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
5037// CHECK26-NEXT: store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
5038// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
5039// CHECK26-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
5040// CHECK26-NEXT: [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i16*
5041// CHECK26-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV2]], align 8
5042// CHECK26-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
5043// CHECK26-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005044// CHECK26-NEXT: [[TMP3:%.*]] = load i32, i32* [[CONV]], align 8
5045// CHECK26-NEXT: [[CONV3:%.*]] = bitcast i64* [[A_CASTED]] to i32*
5046// CHECK26-NEXT: store i32 [[TMP3]], i32* [[CONV3]], align 4
5047// CHECK26-NEXT: [[TMP4:%.*]] = load i64, i64* [[A_CASTED]], align 8
5048// CHECK26-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV1]], align 8
5049// CHECK26-NEXT: [[CONV4:%.*]] = bitcast i64* [[B_CASTED]] to i16*
5050// CHECK26-NEXT: store i16 [[TMP5]], i16* [[CONV4]], align 2
5051// CHECK26-NEXT: [[TMP6:%.*]] = load i64, i64* [[B_CASTED]], align 8
5052// CHECK26-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i64 [[TMP4]], i64 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005053// CHECK26-NEXT: ret void
5054//
5055//
5056// CHECK26-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005057// CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005058// CHECK26-NEXT: entry:
5059// CHECK26-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5060// CHECK26-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005061// CHECK26-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
5062// CHECK26-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005063// CHECK26-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5064// CHECK26-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005065// CHECK26-NEXT: store i64 [[A]], i64* [[A_ADDR]], align 8
5066// CHECK26-NEXT: store i64 [[B]], i64* [[B_ADDR]], align 8
5067// CHECK26-NEXT: [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
5068// CHECK26-NEXT: [[CONV1:%.*]] = bitcast i64* [[B_ADDR]] to i16*
5069// CHECK26-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV1]], align 8
5070// CHECK26-NEXT: [[CONV2:%.*]] = sext i16 [[TMP0]] to i32
5071// CHECK26-NEXT: [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
5072// CHECK26-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV2]]
5073// CHECK26-NEXT: store i32 [[ADD]], i32* [[CONV]], align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005074// CHECK26-NEXT: ret void
5075//
5076//
5077// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005078// CHECK27-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005079// CHECK27-NEXT: entry:
5080// CHECK27-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
5081// CHECK27-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
5082// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
5083// CHECK27-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5084// CHECK27-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
5085// CHECK27-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5086// CHECK27-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
5087// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005088// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005089// CHECK27-NEXT: ret void
5090//
5091//
5092// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005093// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005094// CHECK27-NEXT: entry:
5095// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5096// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5097// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5098// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5099// CHECK27-NEXT: ret void
5100//
5101//
5102// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005103// CHECK27-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005104// CHECK27-NEXT: entry:
5105// CHECK27-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
5106// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5107// CHECK27-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5108// CHECK27-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5109// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005110// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005111// CHECK27-NEXT: ret void
5112//
5113//
5114// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005115// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005116// CHECK27-NEXT: entry:
5117// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5118// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5119// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5120// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5121// CHECK27-NEXT: ret void
5122//
5123//
5124// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005125// CHECK27-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005126// CHECK27-NEXT: entry:
5127// CHECK27-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5128// CHECK27-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
5129// CHECK27-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005130// CHECK27-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005131// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5132// CHECK27-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5133// CHECK27-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5134// CHECK27-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5135// CHECK27-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5136// CHECK27-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5137// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005138// CHECK27-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
5139// CHECK27-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
5140// CHECK27-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
5141// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005142// CHECK27-NEXT: ret void
5143//
5144//
5145// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005146// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005147// CHECK27-NEXT: entry:
5148// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5149// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005150// CHECK27-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5151// CHECK27-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005152// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5153// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005154// CHECK27-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5155// CHECK27-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5156// CHECK27-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5157// CHECK27-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
5158// CHECK27-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005159// CHECK27-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005160// CHECK27-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005161// CHECK27-NEXT: store double [[ADD]], double* [[A]], align 4
5162// CHECK27-NEXT: ret void
5163//
5164//
5165// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005166// CHECK27-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005167// CHECK27-NEXT: entry:
5168// CHECK27-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5169// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5170// CHECK27-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5171// CHECK27-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5172// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005173// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005174// CHECK27-NEXT: ret void
5175//
5176//
5177// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005178// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005179// CHECK27-NEXT: entry:
5180// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5181// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005182// CHECK27-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005183// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5184// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005185// CHECK27-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5186// CHECK27-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5187// CHECK27-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005188// CHECK27-NEXT: store double 2.500000e+00, double* [[A]], align 4
5189// CHECK27-NEXT: ret void
5190//
5191//
5192// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04005193// CHECK27-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005194// CHECK27-NEXT: entry:
5195// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5196// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005197// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005198// CHECK27-NEXT: ret void
5199//
5200//
5201// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005202// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005203// CHECK27-NEXT: entry:
5204// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5205// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5206// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5207// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5208// CHECK27-NEXT: ret void
5209//
5210//
5211// CHECK27-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005212// CHECK27-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005213// CHECK27-NEXT: entry:
5214// CHECK27-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5215// CHECK27-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
5216// CHECK27-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005217// CHECK27-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5218// CHECK27-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005219// CHECK27-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5220// CHECK27-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
5221// CHECK27-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5222// CHECK27-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5223// CHECK27-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
5224// CHECK27-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
5225// CHECK27-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
5226// CHECK27-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
5227// CHECK27-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005228// CHECK27-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
5229// CHECK27-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
5230// CHECK27-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
5231// CHECK27-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
5232// CHECK27-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
5233// CHECK27-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
5234// CHECK27-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
5235// CHECK27-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005236// CHECK27-NEXT: ret void
5237//
5238//
5239// CHECK27-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005240// CHECK27-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005241// CHECK27-NEXT: entry:
5242// CHECK27-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5243// CHECK27-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005244// CHECK27-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5245// CHECK27-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005246// CHECK27-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5247// CHECK27-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005248// CHECK27-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
5249// CHECK27-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5250// CHECK27-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
5251// CHECK27-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
5252// CHECK27-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
5253// CHECK27-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
5254// CHECK27-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
5255// CHECK27-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005256// CHECK27-NEXT: ret void
5257//
5258//
5259// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l104
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005260// CHECK28-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]], i32 [[DOTCAPTURE_EXPR_1:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005261// CHECK28-NEXT: entry:
5262// CHECK28-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
5263// CHECK28-NEXT: [[DOTCAPTURE_EXPR__ADDR2:%.*]] = alloca i32, align 4
5264// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
5265// CHECK28-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5266// CHECK28-NEXT: store i32 [[DOTCAPTURE_EXPR_1]], i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
5267// CHECK28-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5268// CHECK28-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR2]], align 4
5269// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]], i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005270// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005271// CHECK28-NEXT: ret void
5272//
5273//
5274// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005275// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005276// CHECK28-NEXT: entry:
5277// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5278// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5279// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5280// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5281// CHECK28-NEXT: ret void
5282//
5283//
5284// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZL7fstatici_l108
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005285// CHECK28-SAME: (i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005286// CHECK28-NEXT: entry:
5287// CHECK28-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
5288// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5289// CHECK28-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5290// CHECK28-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5291// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005292// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005293// CHECK28-NEXT: ret void
5294//
5295//
5296// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005297// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005298// CHECK28-NEXT: entry:
5299// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5300// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5301// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5302// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5303// CHECK28-NEXT: ret void
5304//
5305//
5306// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l121
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005307// CHECK28-SAME: (%struct.S1* [[THIS:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005308// CHECK28-NEXT: entry:
5309// CHECK28-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5310// CHECK28-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
5311// CHECK28-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005312// CHECK28-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005313// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5314// CHECK28-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5315// CHECK28-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5316// CHECK28-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5317// CHECK28-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5318// CHECK28-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5319// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 [[TMP2]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005320// CHECK28-NEXT: [[TMP3:%.*]] = load i32, i32* [[B_ADDR]], align 4
5321// CHECK28-NEXT: store i32 [[TMP3]], i32* [[B_CASTED]], align 4
5322// CHECK28-NEXT: [[TMP4:%.*]] = load i32, i32* [[B_CASTED]], align 4
5323// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*, i32)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]], i32 [[TMP4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005324// CHECK28-NEXT: ret void
5325//
5326//
5327// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005328// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005329// CHECK28-NEXT: entry:
5330// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5331// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005332// CHECK28-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5333// CHECK28-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005334// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5335// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005336// CHECK28-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5337// CHECK28-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5338// CHECK28-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5339// CHECK28-NEXT: [[TMP1:%.*]] = load i32, i32* [[B_ADDR]], align 4
5340// CHECK28-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005341// CHECK28-NEXT: [[ADD:%.*]] = fadd double [[CONV]], 1.500000e+00
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005342// CHECK28-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005343// CHECK28-NEXT: store double [[ADD]], double* [[A]], align 4
5344// CHECK28-NEXT: ret void
5345//
5346//
5347// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2S12r1Ei_l126
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005348// CHECK28-SAME: (%struct.S1* [[THIS:%.*]]) #[[ATTR2:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005349// CHECK28-NEXT: entry:
5350// CHECK28-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
5351// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5352// CHECK28-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5353// CHECK28-NEXT: [[TMP1:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5354// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005355// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.S1*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), %struct.S1* [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005356// CHECK28-NEXT: ret void
5357//
5358//
5359// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005360// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.S1* [[THIS:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005361// CHECK28-NEXT: entry:
5362// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5363// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005364// CHECK28-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S1*, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005365// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5366// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005367// CHECK28-NEXT: store %struct.S1* [[THIS]], %struct.S1** [[THIS_ADDR]], align 4
5368// CHECK28-NEXT: [[TMP0:%.*]] = load %struct.S1*, %struct.S1** [[THIS_ADDR]], align 4
5369// CHECK28-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S1:%.*]], %struct.S1* [[TMP0]], i32 0, i32 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005370// CHECK28-NEXT: store double 2.500000e+00, double* [[A]], align 4
5371// CHECK28-NEXT: ret void
5372//
5373//
5374// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l88
Jose M Monsalve Diaz0276db12021-07-27 17:20:47 -04005375// CHECK28-SAME: () #[[ATTR3:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005376// CHECK28-NEXT: entry:
5377// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5378// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 0, i32 20)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005379// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005380// CHECK28-NEXT: ret void
5381//
5382//
5383// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005384// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005385// CHECK28-NEXT: entry:
5386// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5387// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5388// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5389// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5390// CHECK28-NEXT: ret void
5391//
5392//
5393// CHECK28-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l93
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005394// CHECK28-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005395// CHECK28-NEXT: entry:
5396// CHECK28-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5397// CHECK28-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
5398// CHECK28-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005399// CHECK28-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5400// CHECK28-NEXT: [[B_CASTED:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005401// CHECK28-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5402// CHECK28-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
5403// CHECK28-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5404// CHECK28-NEXT: store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
5405// CHECK28-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
5406// CHECK28-NEXT: [[CONV1:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR__ADDR]] to i16*
5407// CHECK28-NEXT: [[TMP1:%.*]] = load i16, i16* [[CONV1]], align 4
5408// CHECK28-NEXT: [[TMP2:%.*]] = sext i16 [[TMP1]] to i32
5409// CHECK28-NEXT: call void @__kmpc_push_num_teams(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 [[TMP2]], i32 1024)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005410// CHECK28-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
5411// CHECK28-NEXT: store i32 [[TMP3]], i32* [[A_CASTED]], align 4
5412// CHECK28-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_CASTED]], align 4
5413// CHECK28-NEXT: [[TMP5:%.*]] = load i16, i16* [[CONV]], align 4
5414// CHECK28-NEXT: [[CONV2:%.*]] = bitcast i32* [[B_CASTED]] to i16*
5415// CHECK28-NEXT: store i16 [[TMP5]], i16* [[CONV2]], align 2
5416// CHECK28-NEXT: [[TMP6:%.*]] = load i32, i32* [[B_CASTED]], align 4
5417// CHECK28-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32 [[TMP4]], i32 [[TMP6]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005418// CHECK28-NEXT: ret void
5419//
5420//
5421// CHECK28-LABEL: define {{[^@]+}}@.omp_outlined..5
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005422// CHECK28-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005423// CHECK28-NEXT: entry:
5424// CHECK28-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5425// CHECK28-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005426// CHECK28-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5427// CHECK28-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005428// CHECK28-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5429// CHECK28-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005430// CHECK28-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4
5431// CHECK28-NEXT: store i32 [[B]], i32* [[B_ADDR]], align 4
5432// CHECK28-NEXT: [[CONV:%.*]] = bitcast i32* [[B_ADDR]] to i16*
5433// CHECK28-NEXT: [[TMP0:%.*]] = load i16, i16* [[CONV]], align 4
5434// CHECK28-NEXT: [[CONV1:%.*]] = sext i16 [[TMP0]] to i32
5435// CHECK28-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
5436// CHECK28-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1]], [[CONV1]]
5437// CHECK28-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005438// CHECK28-NEXT: ret void
5439//
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005440//