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