1*828b63c3SDaniil Kovalev; RUN: llc < %s -mtriple=nvptx-unknown-unknown | FileCheck %s
2*828b63c3SDaniil Kovalev;
3*828b63c3SDaniil Kovalev; Check that parameters of a __global__ (kernel) function do not get increased
4*828b63c3SDaniil Kovalev; alignment, and no additional vectorization is performed on loads/stores with
5*828b63c3SDaniil Kovalev; that parameters.
6*828b63c3SDaniil Kovalev;
7*828b63c3SDaniil Kovalev; Test IR is a minimized version of IR generated with the following command
8*828b63c3SDaniil Kovalev; from the source code below:
9*828b63c3SDaniil Kovalev; $ clang++ -O3 --cuda-gpu-arch=sm_35 -S -emit-llvm src.cu
10*828b63c3SDaniil Kovalev;
11*828b63c3SDaniil Kovalev; ----------------------------------------------------------------------------
12*828b63c3SDaniil Kovalev; #include <stdint.h>
13*828b63c3SDaniil Kovalev;
14*828b63c3SDaniil Kovalev; struct St4x1 { uint32_t field[1]; };
15*828b63c3SDaniil Kovalev; struct St4x2 { uint32_t field[2]; };
16*828b63c3SDaniil Kovalev; struct St4x3 { uint32_t field[3]; };
17*828b63c3SDaniil Kovalev; struct St4x4 { uint32_t field[4]; };
18*828b63c3SDaniil Kovalev; struct St4x5 { uint32_t field[5]; };
19*828b63c3SDaniil Kovalev; struct St4x6 { uint32_t field[6]; };
20*828b63c3SDaniil Kovalev; struct St4x7 { uint32_t field[7]; };
21*828b63c3SDaniil Kovalev; struct St4x8 { uint32_t field[8]; };
22*828b63c3SDaniil Kovalev; struct St8x1 { uint64_t field[1]; };
23*828b63c3SDaniil Kovalev; struct St8x2 { uint64_t field[2]; };
24*828b63c3SDaniil Kovalev; struct St8x3 { uint64_t field[3]; };
25*828b63c3SDaniil Kovalev; struct St8x4 { uint64_t field[4]; };
26*828b63c3SDaniil Kovalev;
27*828b63c3SDaniil Kovalev; #define DECLARE_FUNCTION(StName)                                    \
28*828b63c3SDaniil Kovalev; static __global__  __attribute__((noinline))                        \
29*828b63c3SDaniil Kovalev; void foo_##StName(struct StName in, struct StName* ret) {           \
30*828b63c3SDaniil Kovalev;   const unsigned size = sizeof(ret->field) / sizeof(*ret->field);   \
31*828b63c3SDaniil Kovalev;   for (unsigned i = 0; i != size; ++i)                              \
32*828b63c3SDaniil Kovalev;     ret->field[i] = in.field[i];                                    \
33*828b63c3SDaniil Kovalev; }                                                                   \
34*828b63c3SDaniil Kovalev;
35*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x1)
36*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x2)
37*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x3)
38*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x4)
39*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x5)
40*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x6)
41*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x7)
42*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x8)
43*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x1)
44*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x2)
45*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x3)
46*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x4)
47*828b63c3SDaniil Kovalev; ----------------------------------------------------------------------------
48*828b63c3SDaniil Kovalev
49*828b63c3SDaniil Kovalev%struct.St4x1 = type { [1 x i32] }
50*828b63c3SDaniil Kovalev%struct.St4x2 = type { [2 x i32] }
51*828b63c3SDaniil Kovalev%struct.St4x3 = type { [3 x i32] }
52*828b63c3SDaniil Kovalev%struct.St4x4 = type { [4 x i32] }
53*828b63c3SDaniil Kovalev%struct.St4x5 = type { [5 x i32] }
54*828b63c3SDaniil Kovalev%struct.St4x6 = type { [6 x i32] }
55*828b63c3SDaniil Kovalev%struct.St4x7 = type { [7 x i32] }
56*828b63c3SDaniil Kovalev%struct.St4x8 = type { [8 x i32] }
57*828b63c3SDaniil Kovalev%struct.St8x1 = type { [1 x i64] }
58*828b63c3SDaniil Kovalev%struct.St8x2 = type { [2 x i64] }
59*828b63c3SDaniil Kovalev%struct.St8x3 = type { [3 x i64] }
60*828b63c3SDaniil Kovalev%struct.St8x4 = type { [4 x i64] }
61*828b63c3SDaniil Kovalev
62*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x1(%struct.St4x1* nocapture noundef readonly byval(%struct.St4x1) align 4 %in, %struct.St4x1* nocapture noundef writeonly %ret) {
63*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x1(
64*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x1_param_0[4],
65*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x1_param_1
66*828b63c3SDaniil Kovalev  ; CHECK:       )
67*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x1_param_1];
68*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x1_param_0];
69*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
70*828b63c3SDaniil Kovalev  ; CHECK:       ret;
71*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x1, %struct.St4x1* %in, i64 0, i32 0, i64 0
72*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
73*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x1, %struct.St4x1* %ret, i64 0, i32 0, i64 0
74*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
75*828b63c3SDaniil Kovalev  ret void
76*828b63c3SDaniil Kovalev}
77*828b63c3SDaniil Kovalev
78*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x2(%struct.St4x2* nocapture noundef readonly byval(%struct.St4x2) align 4 %in, %struct.St4x2* nocapture noundef writeonly %ret) {
79*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x2(
80*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x2_param_0[8],
81*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x2_param_1
82*828b63c3SDaniil Kovalev  ; CHECK:       )
83*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x2_param_1];
84*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x2_param_0];
85*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
86*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x2_param_0+4];
87*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
88*828b63c3SDaniil Kovalev  ; CHECK:       ret;
89*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 0
90*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
91*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 0
92*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
93*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 1
94*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
95*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 1
96*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
97*828b63c3SDaniil Kovalev  ret void
98*828b63c3SDaniil Kovalev}
99*828b63c3SDaniil Kovalev
100*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x3(%struct.St4x3* nocapture noundef readonly byval(%struct.St4x3) align 4 %in, %struct.St4x3* nocapture noundef writeonly %ret) {
101*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x3(
102*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x3_param_0[12],
103*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x3_param_1
104*828b63c3SDaniil Kovalev  ; CHECK:       )
105*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x3_param_1];
106*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x3_param_0];
107*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
108*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x3_param_0+4];
109*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
110*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x3_param_0+8];
111*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
112*828b63c3SDaniil Kovalev  ; CHECK:       ret;
113*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 0
114*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
115*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 0
116*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
117*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 1
118*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
119*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 1
120*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
121*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 2
122*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
123*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 2
124*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
125*828b63c3SDaniil Kovalev  ret void
126*828b63c3SDaniil Kovalev}
127*828b63c3SDaniil Kovalev
128*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x4(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in, %struct.St4x4* nocapture noundef writeonly %ret) {
129*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x4(
130*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x4_param_0[16],
131*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x4_param_1
132*828b63c3SDaniil Kovalev  ; CHECK:       )
133*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x4_param_1];
134*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x4_param_0];
135*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
136*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x4_param_0+4];
137*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
138*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x4_param_0+8];
139*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
140*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x4_param_0+12];
141*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
142*828b63c3SDaniil Kovalev  ; CHECK:       ret;
143*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0
144*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
145*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 0
146*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
147*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1
148*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
149*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 1
150*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
151*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2
152*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
153*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 2
154*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
155*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3
156*828b63c3SDaniil Kovalev  %4 = load i32, i32* %arrayidx.3, align 4
157*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 3
158*828b63c3SDaniil Kovalev  store i32 %4, i32* %arrayidx3.3, align 4
159*828b63c3SDaniil Kovalev  ret void
160*828b63c3SDaniil Kovalev}
161*828b63c3SDaniil Kovalev
162*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x5(%struct.St4x5* nocapture noundef readonly byval(%struct.St4x5) align 4 %in, %struct.St4x5* nocapture noundef writeonly %ret) {
163*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x5(
164*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x5_param_0[20],
165*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x5_param_1
166*828b63c3SDaniil Kovalev  ; CHECK:       )
167*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x5_param_1];
168*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x5_param_0];
169*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
170*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x5_param_0+4];
171*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
172*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x5_param_0+8];
173*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
174*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x5_param_0+12];
175*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
176*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x5_param_0+16];
177*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
178*828b63c3SDaniil Kovalev  ; CHECK:       ret;
179*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 0
180*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
181*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 0
182*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
183*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 1
184*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
185*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 1
186*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
187*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 2
188*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
189*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 2
190*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
191*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 3
192*828b63c3SDaniil Kovalev  %4 = load i32, i32* %arrayidx.3, align 4
193*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 3
194*828b63c3SDaniil Kovalev  store i32 %4, i32* %arrayidx3.3, align 4
195*828b63c3SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 4
196*828b63c3SDaniil Kovalev  %5 = load i32, i32* %arrayidx.4, align 4
197*828b63c3SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 4
198*828b63c3SDaniil Kovalev  store i32 %5, i32* %arrayidx3.4, align 4
199*828b63c3SDaniil Kovalev  ret void
200*828b63c3SDaniil Kovalev}
201*828b63c3SDaniil Kovalev
202*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x6(%struct.St4x6* nocapture noundef readonly byval(%struct.St4x6) align 4 %in, %struct.St4x6* nocapture noundef writeonly %ret) {
203*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x6(
204*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x6_param_0[24],
205*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x6_param_1
206*828b63c3SDaniil Kovalev  ; CHECK:       )
207*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x6_param_1];
208*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x6_param_0];
209*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
210*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x6_param_0+4];
211*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
212*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x6_param_0+8];
213*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
214*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x6_param_0+12];
215*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
216*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x6_param_0+16];
217*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
218*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x6_param_0+20];
219*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
220*828b63c3SDaniil Kovalev  ; CHECK:       ret;
221*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 0
222*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
223*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 0
224*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
225*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 1
226*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
227*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 1
228*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
229*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 2
230*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
231*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 2
232*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
233*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 3
234*828b63c3SDaniil Kovalev  %4 = load i32, i32* %arrayidx.3, align 4
235*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 3
236*828b63c3SDaniil Kovalev  store i32 %4, i32* %arrayidx3.3, align 4
237*828b63c3SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 4
238*828b63c3SDaniil Kovalev  %5 = load i32, i32* %arrayidx.4, align 4
239*828b63c3SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 4
240*828b63c3SDaniil Kovalev  store i32 %5, i32* %arrayidx3.4, align 4
241*828b63c3SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 5
242*828b63c3SDaniil Kovalev  %6 = load i32, i32* %arrayidx.5, align 4
243*828b63c3SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 5
244*828b63c3SDaniil Kovalev  store i32 %6, i32* %arrayidx3.5, align 4
245*828b63c3SDaniil Kovalev  ret void
246*828b63c3SDaniil Kovalev}
247*828b63c3SDaniil Kovalev
248*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x7(%struct.St4x7* nocapture noundef readonly byval(%struct.St4x7) align 4 %in, %struct.St4x7* nocapture noundef writeonly %ret) {
249*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x7(
250*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x7_param_0[28],
251*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x7_param_1
252*828b63c3SDaniil Kovalev  ; CHECK:       )
253*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x7_param_1];
254*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x7_param_0];
255*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
256*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x7_param_0+4];
257*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
258*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x7_param_0+8];
259*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
260*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x7_param_0+12];
261*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
262*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x7_param_0+16];
263*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
264*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x7_param_0+20];
265*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
266*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x7_param_0+24];
267*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+24], [[R8]];
268*828b63c3SDaniil Kovalev  ; CHECK:       ret;
269*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 0
270*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
271*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 0
272*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
273*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 1
274*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
275*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 1
276*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
277*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 2
278*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
279*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 2
280*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
281*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 3
282*828b63c3SDaniil Kovalev  %4 = load i32, i32* %arrayidx.3, align 4
283*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 3
284*828b63c3SDaniil Kovalev  store i32 %4, i32* %arrayidx3.3, align 4
285*828b63c3SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 4
286*828b63c3SDaniil Kovalev  %5 = load i32, i32* %arrayidx.4, align 4
287*828b63c3SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 4
288*828b63c3SDaniil Kovalev  store i32 %5, i32* %arrayidx3.4, align 4
289*828b63c3SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 5
290*828b63c3SDaniil Kovalev  %6 = load i32, i32* %arrayidx.5, align 4
291*828b63c3SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 5
292*828b63c3SDaniil Kovalev  store i32 %6, i32* %arrayidx3.5, align 4
293*828b63c3SDaniil Kovalev  %arrayidx.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 6
294*828b63c3SDaniil Kovalev  %7 = load i32, i32* %arrayidx.6, align 4
295*828b63c3SDaniil Kovalev  %arrayidx3.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 6
296*828b63c3SDaniil Kovalev  store i32 %7, i32* %arrayidx3.6, align 4
297*828b63c3SDaniil Kovalev  ret void
298*828b63c3SDaniil Kovalev}
299*828b63c3SDaniil Kovalev
300*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x8(%struct.St4x8* nocapture noundef readonly byval(%struct.St4x8) align 4 %in, %struct.St4x8* nocapture noundef writeonly %ret) {
301*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St4x8(
302*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 4 .b8 foo_St4x8_param_0[32],
303*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St4x8_param_1
304*828b63c3SDaniil Kovalev  ; CHECK:       )
305*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x8_param_1];
306*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x8_param_0];
307*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]], [[R2]];
308*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x8_param_0+4];
309*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
310*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x8_param_0+8];
311*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
312*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x8_param_0+12];
313*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
314*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x8_param_0+16];
315*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
316*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x8_param_0+20];
317*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
318*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x8_param_0+24];
319*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+24], [[R8]];
320*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R9:%r[0-9]+]], [foo_St4x8_param_0+28];
321*828b63c3SDaniil Kovalev  ; CHECK:       st.u32  [[[R1]]+28], [[R9]];
322*828b63c3SDaniil Kovalev  ; CHECK:       ret;
323*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 0
324*828b63c3SDaniil Kovalev  %1 = load i32, i32* %arrayidx, align 4
325*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 0
326*828b63c3SDaniil Kovalev  store i32 %1, i32* %arrayidx3, align 4
327*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 1
328*828b63c3SDaniil Kovalev  %2 = load i32, i32* %arrayidx.1, align 4
329*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 1
330*828b63c3SDaniil Kovalev  store i32 %2, i32* %arrayidx3.1, align 4
331*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 2
332*828b63c3SDaniil Kovalev  %3 = load i32, i32* %arrayidx.2, align 4
333*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 2
334*828b63c3SDaniil Kovalev  store i32 %3, i32* %arrayidx3.2, align 4
335*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 3
336*828b63c3SDaniil Kovalev  %4 = load i32, i32* %arrayidx.3, align 4
337*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 3
338*828b63c3SDaniil Kovalev  store i32 %4, i32* %arrayidx3.3, align 4
339*828b63c3SDaniil Kovalev  %arrayidx.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 4
340*828b63c3SDaniil Kovalev  %5 = load i32, i32* %arrayidx.4, align 4
341*828b63c3SDaniil Kovalev  %arrayidx3.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 4
342*828b63c3SDaniil Kovalev  store i32 %5, i32* %arrayidx3.4, align 4
343*828b63c3SDaniil Kovalev  %arrayidx.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 5
344*828b63c3SDaniil Kovalev  %6 = load i32, i32* %arrayidx.5, align 4
345*828b63c3SDaniil Kovalev  %arrayidx3.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 5
346*828b63c3SDaniil Kovalev  store i32 %6, i32* %arrayidx3.5, align 4
347*828b63c3SDaniil Kovalev  %arrayidx.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 6
348*828b63c3SDaniil Kovalev  %7 = load i32, i32* %arrayidx.6, align 4
349*828b63c3SDaniil Kovalev  %arrayidx3.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 6
350*828b63c3SDaniil Kovalev  store i32 %7, i32* %arrayidx3.6, align 4
351*828b63c3SDaniil Kovalev  %arrayidx.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 7
352*828b63c3SDaniil Kovalev  %8 = load i32, i32* %arrayidx.7, align 4
353*828b63c3SDaniil Kovalev  %arrayidx3.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 7
354*828b63c3SDaniil Kovalev  store i32 %8, i32* %arrayidx3.7, align 4
355*828b63c3SDaniil Kovalev  ret void
356*828b63c3SDaniil Kovalev}
357*828b63c3SDaniil Kovalev
358*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x1(%struct.St8x1* nocapture noundef readonly byval(%struct.St8x1) align 8 %in, %struct.St8x1* nocapture noundef writeonly %ret) {
359*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x1(
360*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x1_param_0[8],
361*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x1_param_1
362*828b63c3SDaniil Kovalev  ; CHECK:       )
363*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x1_param_1];
364*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x1_param_0];
365*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
366*828b63c3SDaniil Kovalev  ; CHECK:       ret;
367*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St8x1, %struct.St8x1* %in, i64 0, i32 0, i64 0
368*828b63c3SDaniil Kovalev  %1 = load i64, i64* %arrayidx, align 8
369*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St8x1, %struct.St8x1* %ret, i64 0, i32 0, i64 0
370*828b63c3SDaniil Kovalev  store i64 %1, i64* %arrayidx3, align 8
371*828b63c3SDaniil Kovalev  ret void
372*828b63c3SDaniil Kovalev}
373*828b63c3SDaniil Kovalev
374*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x2(%struct.St8x2* nocapture noundef readonly byval(%struct.St8x2) align 8 %in, %struct.St8x2* nocapture noundef writeonly %ret) {
375*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x2(
376*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x2_param_0[16],
377*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x2_param_1
378*828b63c3SDaniil Kovalev  ; CHECK:       )
379*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x2_param_1];
380*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x2_param_0];
381*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
382*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x2_param_0+8];
383*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
384*828b63c3SDaniil Kovalev  ; CHECK:       ret;
385*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 0
386*828b63c3SDaniil Kovalev  %1 = load i64, i64* %arrayidx, align 8
387*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 0
388*828b63c3SDaniil Kovalev  store i64 %1, i64* %arrayidx3, align 8
389*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 1
390*828b63c3SDaniil Kovalev  %2 = load i64, i64* %arrayidx.1, align 8
391*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 1
392*828b63c3SDaniil Kovalev  store i64 %2, i64* %arrayidx3.1, align 8
393*828b63c3SDaniil Kovalev  ret void
394*828b63c3SDaniil Kovalev}
395*828b63c3SDaniil Kovalev
396*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x3(%struct.St8x3* nocapture noundef readonly byval(%struct.St8x3) align 8 %in, %struct.St8x3* nocapture noundef writeonly %ret) {
397*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x3(
398*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x3_param_0[24],
399*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x3_param_1
400*828b63c3SDaniil Kovalev  ; CHECK:       )
401*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x3_param_1];
402*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x3_param_0];
403*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
404*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x3_param_0+8];
405*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
406*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x3_param_0+16];
407*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+16], [[RD3]];
408*828b63c3SDaniil Kovalev  ; CHECK:       ret;
409*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 0
410*828b63c3SDaniil Kovalev  %1 = load i64, i64* %arrayidx, align 8
411*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 0
412*828b63c3SDaniil Kovalev  store i64 %1, i64* %arrayidx3, align 8
413*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 1
414*828b63c3SDaniil Kovalev  %2 = load i64, i64* %arrayidx.1, align 8
415*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 1
416*828b63c3SDaniil Kovalev  store i64 %2, i64* %arrayidx3.1, align 8
417*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 2
418*828b63c3SDaniil Kovalev  %3 = load i64, i64* %arrayidx.2, align 8
419*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 2
420*828b63c3SDaniil Kovalev  store i64 %3, i64* %arrayidx3.2, align 8
421*828b63c3SDaniil Kovalev  ret void
422*828b63c3SDaniil Kovalev}
423*828b63c3SDaniil Kovalev
424*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x4(%struct.St8x4* nocapture noundef readonly byval(%struct.St8x4) align 8 %in, %struct.St8x4* nocapture noundef writeonly %ret) {
425*828b63c3SDaniil Kovalev  ; CHECK-LABEL: .visible .func foo_St8x4(
426*828b63c3SDaniil Kovalev  ; CHECK:               .param .align 8 .b8 foo_St8x4_param_0[32],
427*828b63c3SDaniil Kovalev  ; CHECK:               .param .b32 foo_St8x4_param_1
428*828b63c3SDaniil Kovalev  ; CHECK:       )
429*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x4_param_1];
430*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x4_param_0];
431*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]], [[RD1]];
432*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x4_param_0+8];
433*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
434*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x4_param_0+16];
435*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+16], [[RD3]];
436*828b63c3SDaniil Kovalev  ; CHECK:       ld.param.u64 [[RD4:%rd[0-9]+]], [foo_St8x4_param_0+24];
437*828b63c3SDaniil Kovalev  ; CHECK:       st.u64 [[[R1]]+24], [[RD4]];
438*828b63c3SDaniil Kovalev  ; CHECK:       ret;
439*828b63c3SDaniil Kovalev  %arrayidx = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 0
440*828b63c3SDaniil Kovalev  %1 = load i64, i64* %arrayidx, align 8
441*828b63c3SDaniil Kovalev  %arrayidx3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 0
442*828b63c3SDaniil Kovalev  store i64 %1, i64* %arrayidx3, align 8
443*828b63c3SDaniil Kovalev  %arrayidx.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 1
444*828b63c3SDaniil Kovalev  %2 = load i64, i64* %arrayidx.1, align 8
445*828b63c3SDaniil Kovalev  %arrayidx3.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 1
446*828b63c3SDaniil Kovalev  store i64 %2, i64* %arrayidx3.1, align 8
447*828b63c3SDaniil Kovalev  %arrayidx.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 2
448*828b63c3SDaniil Kovalev  %3 = load i64, i64* %arrayidx.2, align 8
449*828b63c3SDaniil Kovalev  %arrayidx3.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 2
450*828b63c3SDaniil Kovalev  store i64 %3, i64* %arrayidx3.2, align 8
451*828b63c3SDaniil Kovalev  %arrayidx.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 3
452*828b63c3SDaniil Kovalev  %4 = load i64, i64* %arrayidx.3, align 8
453*828b63c3SDaniil Kovalev  %arrayidx3.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 3
454*828b63c3SDaniil Kovalev  store i64 %4, i64* %arrayidx3.3, align 8
455*828b63c3SDaniil Kovalev  ret void
456*828b63c3SDaniil Kovalev}
457