1828b63c3SDaniil Kovalev; RUN: llc < %s -mtriple=nvptx-unknown-unknown | FileCheck %s
2828b63c3SDaniil Kovalev;
3828b63c3SDaniil Kovalev; Check that parameters of a __global__ (kernel) function do not get increased
4828b63c3SDaniil Kovalev; alignment, and no additional vectorization is performed on loads/stores with
5828b63c3SDaniil Kovalev; that parameters.
6828b63c3SDaniil Kovalev;
7828b63c3SDaniil Kovalev; Test IR is a minimized version of IR generated with the following command
8828b63c3SDaniil Kovalev; from the source code below:
9828b63c3SDaniil Kovalev; $ clang++ -O3 --cuda-gpu-arch=sm_35 -S -emit-llvm src.cu
10828b63c3SDaniil Kovalev;
11828b63c3SDaniil Kovalev; ----------------------------------------------------------------------------
12828b63c3SDaniil Kovalev; #include <stdint.h>
13828b63c3SDaniil Kovalev;
14828b63c3SDaniil Kovalev; struct St4x1 { uint32_t field[1]; };
15828b63c3SDaniil Kovalev; struct St4x2 { uint32_t field[2]; };
16828b63c3SDaniil Kovalev; struct St4x3 { uint32_t field[3]; };
17828b63c3SDaniil Kovalev; struct St4x4 { uint32_t field[4]; };
18828b63c3SDaniil Kovalev; struct St4x5 { uint32_t field[5]; };
19828b63c3SDaniil Kovalev; struct St4x6 { uint32_t field[6]; };
20828b63c3SDaniil Kovalev; struct St4x7 { uint32_t field[7]; };
21828b63c3SDaniil Kovalev; struct St4x8 { uint32_t field[8]; };
22828b63c3SDaniil Kovalev; struct St8x1 { uint64_t field[1]; };
23828b63c3SDaniil Kovalev; struct St8x2 { uint64_t field[2]; };
24828b63c3SDaniil Kovalev; struct St8x3 { uint64_t field[3]; };
25828b63c3SDaniil Kovalev; struct St8x4 { uint64_t field[4]; };
26828b63c3SDaniil Kovalev;
27828b63c3SDaniil Kovalev; #define DECLARE_FUNCTION(StName)                                    \
28828b63c3SDaniil Kovalev; static __global__  __attribute__((noinline))                        \
29828b63c3SDaniil Kovalev; void foo_##StName(struct StName in, struct StName* ret) {           \
30828b63c3SDaniil Kovalev;   const unsigned size = sizeof(ret->field) / sizeof(*ret->field);   \
31828b63c3SDaniil Kovalev;   for (unsigned i = 0; i != size; ++i)                              \
32828b63c3SDaniil Kovalev;     ret->field[i] = in.field[i];                                    \
33828b63c3SDaniil Kovalev; }                                                                   \
34828b63c3SDaniil Kovalev;
35828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x1)
36828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x2)
37828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x3)
38828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x4)
39828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x5)
40828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x6)
41828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x7)
42828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x8)
43828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x1)
44828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x2)
45828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x3)
46828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x4)
47828b63c3SDaniil Kovalev; ----------------------------------------------------------------------------
48828b63c3SDaniil Kovalev
49828b63c3SDaniil Kovalev%struct.St4x1 = type { [1 x i32] }
50828b63c3SDaniil Kovalev%struct.St4x2 = type { [2 x i32] }
51828b63c3SDaniil Kovalev%struct.St4x3 = type { [3 x i32] }
52828b63c3SDaniil Kovalev%struct.St4x4 = type { [4 x i32] }
53828b63c3SDaniil Kovalev%struct.St4x5 = type { [5 x i32] }
54828b63c3SDaniil Kovalev%struct.St4x6 = type { [6 x i32] }
55828b63c3SDaniil Kovalev%struct.St4x7 = type { [7 x i32] }
56828b63c3SDaniil Kovalev%struct.St4x8 = type { [8 x i32] }
57828b63c3SDaniil Kovalev%struct.St8x1 = type { [1 x i64] }
58828b63c3SDaniil Kovalev%struct.St8x2 = type { [2 x i64] }
59828b63c3SDaniil Kovalev%struct.St8x3 = type { [3 x i64] }
60828b63c3SDaniil Kovalev%struct.St8x4 = type { [4 x i64] }
61828b63c3SDaniil Kovalev
62*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x1(ptr nocapture noundef readonly byval(%struct.St4x1) align 4 %in, ptr nocapture noundef writeonly %ret) {
63828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x1(
64828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x1_param_0[4],
65828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x1_param_1
66828b63c3SDaniil Kovalev  ; CHECK:       )
67828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x1_param_1];
68828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x1_param_0];
69828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
70828b63c3SDaniil Kovalev  ; CHECK:       ret;
71*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
72*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
73828b63c3SDaniil Kovalev  ret void
74828b63c3SDaniil Kovalev}
75828b63c3SDaniil Kovalev
76*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x2(ptr nocapture noundef readonly byval(%struct.St4x2) align 4 %in, ptr nocapture noundef writeonly %ret) {
77828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x2(
78828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x2_param_0[8],
79828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x2_param_1
80828b63c3SDaniil Kovalev  ; CHECK:       )
81828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x2_param_1];
82828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x2_param_0];
83828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
84828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x2_param_0+4];
85828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
86828b63c3SDaniil Kovalev  ; CHECK:       ret;
87*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
88*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
89*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [2 x i32], ptr %in, i64 0, i64 1
90*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
91*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [2 x i32], ptr %ret, i64 0, i64 1
92*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
93828b63c3SDaniil Kovalev  ret void
94828b63c3SDaniil Kovalev}
95828b63c3SDaniil Kovalev
96*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x3(ptr nocapture noundef readonly byval(%struct.St4x3) align 4 %in, ptr nocapture noundef writeonly %ret) {
97828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x3(
98828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x3_param_0[12],
99828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x3_param_1
100828b63c3SDaniil Kovalev  ; CHECK:       )
101828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x3_param_1];
102828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x3_param_0];
103828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
104828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x3_param_0+4];
105828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
106828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x3_param_0+8];
107828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
108828b63c3SDaniil Kovalev  ; CHECK:       ret;
109*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
110*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
111*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 1
112*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
113*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 1
114*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
115*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 2
116*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
117*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 2
118*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
119828b63c3SDaniil Kovalev  ret void
120828b63c3SDaniil Kovalev}
121828b63c3SDaniil Kovalev
122*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x4(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in, ptr nocapture noundef writeonly %ret) {
123828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x4(
124828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x4_param_0[16],
125828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x4_param_1
126828b63c3SDaniil Kovalev  ; CHECK:       )
127828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x4_param_1];
128828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x4_param_0];
129828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
130828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x4_param_0+4];
131828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
132828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x4_param_0+8];
133828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
134828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x4_param_0+12];
135828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
136828b63c3SDaniil Kovalev  ; CHECK:       ret;
137*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
138*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
139*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1
140*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
141*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 1
142*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
143*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2
144*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
145*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 2
146*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
147*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3
148*eb3d6469SDaniil Kovalev  %4 = load i32, ptr %arrayidx.3, align 4
149*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 3
150*eb3d6469SDaniil Kovalev  store i32 %4, ptr %arrayidx3.3, align 4
151828b63c3SDaniil Kovalev  ret void
152828b63c3SDaniil Kovalev}
153828b63c3SDaniil Kovalev
154*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x5(ptr nocapture noundef readonly byval(%struct.St4x5) align 4 %in, ptr nocapture noundef writeonly %ret) {
155828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x5(
156828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x5_param_0[20],
157828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x5_param_1
158828b63c3SDaniil Kovalev  ; CHECK:       )
159828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x5_param_1];
160828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x5_param_0];
161828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
162828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x5_param_0+4];
163828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
164828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x5_param_0+8];
165828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
166828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x5_param_0+12];
167828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
168828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x5_param_0+16];
169828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
170828b63c3SDaniil Kovalev  ; CHECK:       ret;
171*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
172*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
173*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 1
174*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
175*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 1
176*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
177*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 2
178*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
179*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 2
180*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
181*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 3
182*eb3d6469SDaniil Kovalev  %4 = load i32, ptr %arrayidx.3, align 4
183*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 3
184*eb3d6469SDaniil Kovalev  store i32 %4, ptr %arrayidx3.3, align 4
185*eb3d6469SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 4
186*eb3d6469SDaniil Kovalev  %5 = load i32, ptr %arrayidx.4, align 4
187*eb3d6469SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 4
188*eb3d6469SDaniil Kovalev  store i32 %5, ptr %arrayidx3.4, align 4
189828b63c3SDaniil Kovalev  ret void
190828b63c3SDaniil Kovalev}
191828b63c3SDaniil Kovalev
192*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x6(ptr nocapture noundef readonly byval(%struct.St4x6) align 4 %in, ptr nocapture noundef writeonly %ret) {
193828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x6(
194828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x6_param_0[24],
195828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x6_param_1
196828b63c3SDaniil Kovalev  ; CHECK:       )
197828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x6_param_1];
198828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x6_param_0];
199828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
200828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x6_param_0+4];
201828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
202828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x6_param_0+8];
203828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
204828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x6_param_0+12];
205828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
206828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x6_param_0+16];
207828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
208828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x6_param_0+20];
209828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
210828b63c3SDaniil Kovalev  ; CHECK:       ret;
211*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
212*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
213*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 1
214*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
215*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 1
216*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
217*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 2
218*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
219*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 2
220*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
221*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 3
222*eb3d6469SDaniil Kovalev  %4 = load i32, ptr %arrayidx.3, align 4
223*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 3
224*eb3d6469SDaniil Kovalev  store i32 %4, ptr %arrayidx3.3, align 4
225*eb3d6469SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 4
226*eb3d6469SDaniil Kovalev  %5 = load i32, ptr %arrayidx.4, align 4
227*eb3d6469SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 4
228*eb3d6469SDaniil Kovalev  store i32 %5, ptr %arrayidx3.4, align 4
229*eb3d6469SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 5
230*eb3d6469SDaniil Kovalev  %6 = load i32, ptr %arrayidx.5, align 4
231*eb3d6469SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 5
232*eb3d6469SDaniil Kovalev  store i32 %6, ptr %arrayidx3.5, align 4
233828b63c3SDaniil Kovalev  ret void
234828b63c3SDaniil Kovalev}
235828b63c3SDaniil Kovalev
236*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x7(ptr nocapture noundef readonly byval(%struct.St4x7) align 4 %in, ptr nocapture noundef writeonly %ret) {
237828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x7(
238828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x7_param_0[28],
239828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x7_param_1
240828b63c3SDaniil Kovalev  ; CHECK:       )
241828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x7_param_1];
242828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x7_param_0];
243828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
244828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x7_param_0+4];
245828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
246828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x7_param_0+8];
247828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
248828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x7_param_0+12];
249828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
250828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x7_param_0+16];
251828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
252828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x7_param_0+20];
253828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
254828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x7_param_0+24];
255828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+24], [[R8]];
256828b63c3SDaniil Kovalev  ; CHECK:       ret;
257*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
258*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
259*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 1
260*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
261*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 1
262*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
263*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 2
264*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
265*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 2
266*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
267*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 3
268*eb3d6469SDaniil Kovalev  %4 = load i32, ptr %arrayidx.3, align 4
269*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 3
270*eb3d6469SDaniil Kovalev  store i32 %4, ptr %arrayidx3.3, align 4
271*eb3d6469SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 4
272*eb3d6469SDaniil Kovalev  %5 = load i32, ptr %arrayidx.4, align 4
273*eb3d6469SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 4
274*eb3d6469SDaniil Kovalev  store i32 %5, ptr %arrayidx3.4, align 4
275*eb3d6469SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 5
276*eb3d6469SDaniil Kovalev  %6 = load i32, ptr %arrayidx.5, align 4
277*eb3d6469SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 5
278*eb3d6469SDaniil Kovalev  store i32 %6, ptr %arrayidx3.5, align 4
279*eb3d6469SDaniil Kovalev  %arrayidx.6 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 6
280*eb3d6469SDaniil Kovalev  %7 = load i32, ptr %arrayidx.6, align 4
281*eb3d6469SDaniil Kovalev  %arrayidx3.6 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 6
282*eb3d6469SDaniil Kovalev  store i32 %7, ptr %arrayidx3.6, align 4
283828b63c3SDaniil Kovalev  ret void
284828b63c3SDaniil Kovalev}
285828b63c3SDaniil Kovalev
286*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x8(ptr nocapture noundef readonly byval(%struct.St4x8) align 4 %in, ptr nocapture noundef writeonly %ret) {
287828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x8(
288828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x8_param_0[32],
289828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x8_param_1
290828b63c3SDaniil Kovalev  ; CHECK:       )
291828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x8_param_1];
292828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x8_param_0];
293828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
294828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x8_param_0+4];
295828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
296828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x8_param_0+8];
297828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
298828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x8_param_0+12];
299828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
300828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x8_param_0+16];
301828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
302828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x8_param_0+20];
303828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
304828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x8_param_0+24];
305828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+24], [[R8]];
306828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R9:%r[0-9]+]], [foo_St4x8_param_0+28];
307828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+28], [[R9]];
308828b63c3SDaniil Kovalev  ; CHECK:       ret;
309*eb3d6469SDaniil Kovalev  %1 = load i32, ptr %in, align 4
310*eb3d6469SDaniil Kovalev  store i32 %1, ptr %ret, align 4
311*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 1
312*eb3d6469SDaniil Kovalev  %2 = load i32, ptr %arrayidx.1, align 4
313*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 1
314*eb3d6469SDaniil Kovalev  store i32 %2, ptr %arrayidx3.1, align 4
315*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 2
316*eb3d6469SDaniil Kovalev  %3 = load i32, ptr %arrayidx.2, align 4
317*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 2
318*eb3d6469SDaniil Kovalev  store i32 %3, ptr %arrayidx3.2, align 4
319*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 3
320*eb3d6469SDaniil Kovalev  %4 = load i32, ptr %arrayidx.3, align 4
321*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 3
322*eb3d6469SDaniil Kovalev  store i32 %4, ptr %arrayidx3.3, align 4
323*eb3d6469SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 4
324*eb3d6469SDaniil Kovalev  %5 = load i32, ptr %arrayidx.4, align 4
325*eb3d6469SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 4
326*eb3d6469SDaniil Kovalev  store i32 %5, ptr %arrayidx3.4, align 4
327*eb3d6469SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 5
328*eb3d6469SDaniil Kovalev  %6 = load i32, ptr %arrayidx.5, align 4
329*eb3d6469SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 5
330*eb3d6469SDaniil Kovalev  store i32 %6, ptr %arrayidx3.5, align 4
331*eb3d6469SDaniil Kovalev  %arrayidx.6 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 6
332*eb3d6469SDaniil Kovalev  %7 = load i32, ptr %arrayidx.6, align 4
333*eb3d6469SDaniil Kovalev  %arrayidx3.6 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 6
334*eb3d6469SDaniil Kovalev  store i32 %7, ptr %arrayidx3.6, align 4
335*eb3d6469SDaniil Kovalev  %arrayidx.7 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 7
336*eb3d6469SDaniil Kovalev  %8 = load i32, ptr %arrayidx.7, align 4
337*eb3d6469SDaniil Kovalev  %arrayidx3.7 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 7
338*eb3d6469SDaniil Kovalev  store i32 %8, ptr %arrayidx3.7, align 4
339828b63c3SDaniil Kovalev  ret void
340828b63c3SDaniil Kovalev}
341828b63c3SDaniil Kovalev
342*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x1(ptr nocapture noundef readonly byval(%struct.St8x1) align 8 %in, ptr nocapture noundef writeonly %ret) {
343828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x1(
344828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x1_param_0[8],
345828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x1_param_1
346828b63c3SDaniil Kovalev  ; CHECK:       )
347828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x1_param_1];
348828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x1_param_0];
349828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
350828b63c3SDaniil Kovalev  ; CHECK:       ret;
351*eb3d6469SDaniil Kovalev  %1 = load i64, ptr %in, align 8
352*eb3d6469SDaniil Kovalev  store i64 %1, ptr %ret, align 8
353828b63c3SDaniil Kovalev  ret void
354828b63c3SDaniil Kovalev}
355828b63c3SDaniil Kovalev
356*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x2(ptr nocapture noundef readonly byval(%struct.St8x2) align 8 %in, ptr nocapture noundef writeonly %ret) {
357828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x2(
358828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x2_param_0[16],
359828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x2_param_1
360828b63c3SDaniil Kovalev  ; CHECK:       )
361828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x2_param_1];
362828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x2_param_0];
363828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
364828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x2_param_0+8];
365828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
366828b63c3SDaniil Kovalev  ; CHECK:       ret;
367*eb3d6469SDaniil Kovalev  %1 = load i64, ptr %in, align 8
368*eb3d6469SDaniil Kovalev  store i64 %1, ptr %ret, align 8
369*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [2 x i64], ptr %in, i64 0, i64 1
370*eb3d6469SDaniil Kovalev  %2 = load i64, ptr %arrayidx.1, align 8
371*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [2 x i64], ptr %ret, i64 0, i64 1
372*eb3d6469SDaniil Kovalev  store i64 %2, ptr %arrayidx3.1, align 8
373828b63c3SDaniil Kovalev  ret void
374828b63c3SDaniil Kovalev}
375828b63c3SDaniil Kovalev
376*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x3(ptr nocapture noundef readonly byval(%struct.St8x3) align 8 %in, ptr nocapture noundef writeonly %ret) {
377828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x3(
378828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x3_param_0[24],
379828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x3_param_1
380828b63c3SDaniil Kovalev  ; CHECK:       )
381828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x3_param_1];
382828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x3_param_0];
383828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
384828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x3_param_0+8];
385828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
386828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x3_param_0+16];
387828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+16], [[RD3]];
388828b63c3SDaniil Kovalev  ; CHECK:       ret;
389*eb3d6469SDaniil Kovalev  %1 = load i64, ptr %in, align 8
390*eb3d6469SDaniil Kovalev  store i64 %1, ptr %ret, align 8
391*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 1
392*eb3d6469SDaniil Kovalev  %2 = load i64, ptr %arrayidx.1, align 8
393*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 1
394*eb3d6469SDaniil Kovalev  store i64 %2, ptr %arrayidx3.1, align 8
395*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 2
396*eb3d6469SDaniil Kovalev  %3 = load i64, ptr %arrayidx.2, align 8
397*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 2
398*eb3d6469SDaniil Kovalev  store i64 %3, ptr %arrayidx3.2, align 8
399828b63c3SDaniil Kovalev  ret void
400828b63c3SDaniil Kovalev}
401828b63c3SDaniil Kovalev
402*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x4(ptr nocapture noundef readonly byval(%struct.St8x4) align 8 %in, ptr nocapture noundef writeonly %ret) {
403828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x4(
404828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x4_param_0[32],
405828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x4_param_1
406828b63c3SDaniil Kovalev  ; CHECK:       )
407828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x4_param_1];
408828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x4_param_0];
409828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
410828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x4_param_0+8];
411828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
412828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x4_param_0+16];
413828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+16], [[RD3]];
414828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD4:%rd[0-9]+]], [foo_St8x4_param_0+24];
415828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+24], [[RD4]];
416828b63c3SDaniil Kovalev  ; CHECK:       ret;
417*eb3d6469SDaniil Kovalev  %1 = load i64, ptr %in, align 8
418*eb3d6469SDaniil Kovalev  store i64 %1, ptr %ret, align 8
419*eb3d6469SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 1
420*eb3d6469SDaniil Kovalev  %2 = load i64, ptr %arrayidx.1, align 8
421*eb3d6469SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 1
422*eb3d6469SDaniil Kovalev  store i64 %2, ptr %arrayidx3.1, align 8
423*eb3d6469SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 2
424*eb3d6469SDaniil Kovalev  %3 = load i64, ptr %arrayidx.2, align 8
425*eb3d6469SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 2
426*eb3d6469SDaniil Kovalev  store i64 %3, ptr %arrayidx3.2, align 8
427*eb3d6469SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 3
428*eb3d6469SDaniil Kovalev  %4 = load i64, ptr %arrayidx.3, align 8
429*eb3d6469SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 3
430*eb3d6469SDaniil Kovalev  store i64 %4, ptr %arrayidx3.3, align 8
431828b63c3SDaniil Kovalev  ret void
432828b63c3SDaniil Kovalev}
433