1; RUN: llc --march=mips64 -mcpu=mips64r2 < %s | FileCheck %s
2
3; Generated from the C program:
4;
5; #include <stdio.h>
6; #include <string.h>
7;
8; struct SmallStruct_1b {
9;  char x1;
10; };
11;
12; struct SmallStruct_2b {
13;  char x1;
14;  char x2;
15; };
16;
17; struct SmallStruct_3b {
18;  char x1;
19;  char x2;
20;  char x3;
21; };
22;
23; struct SmallStruct_4b {
24;  char x1;
25;  char x2;
26;  char x3;
27;  char x4;
28; };
29;
30; struct SmallStruct_5b {
31;  char x1;
32;  char x2;
33;  char x3;
34;  char x4;
35;  char x5;
36; };
37;
38; struct SmallStruct_6b {
39;  char x1;
40;  char x2;
41;  char x3;
42;  char x4;
43;  char x5;
44;  char x6;
45; };
46;
47; struct SmallStruct_7b {
48;  char x1;
49;  char x2;
50;  char x3;
51;  char x4;
52;  char x5;
53;  char x6;
54;  char x7;
55; };
56;
57; struct SmallStruct_8b {
58;  char x1;
59;  char x2;
60;  char x3;
61;  char x4;
62;  char x5;
63;  char x6;
64;  char x7;
65;  char x8;
66; };
67;
68; struct SmallStruct_9b {
69;  char x1;
70;  char x2;
71;  char x3;
72;  char x4;
73;  char x5;
74;  char x6;
75;  char x7;
76;  char x8;
77;  char x9;
78; };
79;
80; void varArgF_SmallStruct(char* c, ...);
81;
82; void smallStruct_1b(struct SmallStruct_1b* ss) {
83;  varArgF_SmallStruct("", *ss);
84; }
85;
86; void smallStruct_2b(struct SmallStruct_2b* ss) {
87;  varArgF_SmallStruct("", *ss);
88; }
89;
90; void smallStruct_3b(struct SmallStruct_3b* ss)
91; {
92;  varArgF_SmallStruct("", *ss);
93; }
94;
95; void smallStruct_4b(struct SmallStruct_4b* ss)
96; {
97;  varArgF_SmallStruct("", *ss);
98; }
99;
100; void smallStruct_5b(struct SmallStruct_5b* ss)
101; {
102;  varArgF_SmallStruct("", *ss);
103; }
104;
105; void smallStruct_6b(struct SmallStruct_6b* ss)
106; {
107;  varArgF_SmallStruct("", *ss);
108; }
109;
110; void smallStruct_7b(struct SmallStruct_7b* ss)
111; {
112;  varArgF_SmallStruct("", *ss);
113; }
114;
115; void smallStruct_8b(struct SmallStruct_8b* ss)
116; {
117;  varArgF_SmallStruct("", *ss);
118; }
119;
120; void smallStruct_9b(struct SmallStruct_9b* ss)
121; {
122;  varArgF_SmallStruct("", *ss);
123; }
124
125%struct.SmallStruct_1b = type { i8 }
126%struct.SmallStruct_2b = type { i8, i8 }
127%struct.SmallStruct_3b = type { i8, i8, i8 }
128%struct.SmallStruct_4b = type { i8, i8, i8, i8 }
129%struct.SmallStruct_5b = type { i8, i8, i8, i8, i8 }
130%struct.SmallStruct_6b = type { i8, i8, i8, i8, i8, i8 }
131%struct.SmallStruct_7b = type { i8, i8, i8, i8, i8, i8, i8 }
132%struct.SmallStruct_8b = type { i8, i8, i8, i8, i8, i8, i8, i8 }
133%struct.SmallStruct_9b = type { i8, i8, i8, i8, i8, i8, i8, i8, i8 }
134
135@.str = private unnamed_addr constant [3 x i8] c"01\00", align 1
136
137declare void @varArgF_SmallStruct(i8* %c, ...)
138
139define void @smallStruct_1b(%struct.SmallStruct_1b* %ss) #0 {
140entry:
141  %ss.addr = alloca %struct.SmallStruct_1b*, align 8
142  store %struct.SmallStruct_1b* %ss, %struct.SmallStruct_1b** %ss.addr, align 8
143  %0 = load %struct.SmallStruct_1b*, %struct.SmallStruct_1b** %ss.addr, align 8
144  %1 = bitcast %struct.SmallStruct_1b* %0 to { i8 }*
145  %2 = getelementptr { i8 }, { i8 }* %1, i32 0, i32 0
146  %3 = load i8, i8* %2, align 1
147  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8 inreg %3)
148  ret void
149 ; CHECK-LABEL: smallStruct_1b:
150 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 56
151}
152
153define void @smallStruct_2b(%struct.SmallStruct_2b* %ss) #0 {
154entry:
155  %ss.addr = alloca %struct.SmallStruct_2b*, align 8
156  store %struct.SmallStruct_2b* %ss, %struct.SmallStruct_2b** %ss.addr, align 8
157  %0 = load %struct.SmallStruct_2b*, %struct.SmallStruct_2b** %ss.addr, align 8
158  %1 = bitcast %struct.SmallStruct_2b* %0 to { i16 }*
159  %2 = getelementptr { i16 }, { i16 }* %1, i32 0, i32 0
160  %3 = load i16, i16* %2, align 1
161  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i16 inreg %3)
162  ret void
163 ; CHECK-LABEL: smallStruct_2b:
164 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 48
165}
166
167define void @smallStruct_3b(%struct.SmallStruct_3b* %ss) #0 {
168entry:
169  %ss.addr = alloca %struct.SmallStruct_3b*, align 8
170  %.coerce = alloca { i24 }
171  store %struct.SmallStruct_3b* %ss, %struct.SmallStruct_3b** %ss.addr, align 8
172  %0 = load %struct.SmallStruct_3b*, %struct.SmallStruct_3b** %ss.addr, align 8
173  %1 = bitcast { i24 }* %.coerce to i8*
174  %2 = bitcast %struct.SmallStruct_3b* %0 to i8*
175  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 3, i32 0, i1 false)
176  %3 = getelementptr { i24 }, { i24 }* %.coerce, i32 0, i32 0
177  %4 = load i24, i24* %3, align 1
178  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i24 inreg %4)
179  ret void
180 ; CHECK-LABEL: smallStruct_3b:
181 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 40
182}
183
184declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1
185
186define void @smallStruct_4b(%struct.SmallStruct_4b* %ss) #0 {
187entry:
188  %ss.addr = alloca %struct.SmallStruct_4b*, align 8
189  store %struct.SmallStruct_4b* %ss, %struct.SmallStruct_4b** %ss.addr, align 8
190  %0 = load %struct.SmallStruct_4b*, %struct.SmallStruct_4b** %ss.addr, align 8
191  %1 = bitcast %struct.SmallStruct_4b* %0 to { i32 }*
192  %2 = getelementptr { i32 }, { i32 }* %1, i32 0, i32 0
193  %3 = load i32, i32* %2, align 1
194  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i32 inreg %3)
195  ret void
196 ; CHECK-LABEL: smallStruct_4b:
197 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 32
198}
199
200define void @smallStruct_5b(%struct.SmallStruct_5b* %ss) #0 {
201entry:
202  %ss.addr = alloca %struct.SmallStruct_5b*, align 8
203  %.coerce = alloca { i40 }
204  store %struct.SmallStruct_5b* %ss, %struct.SmallStruct_5b** %ss.addr, align 8
205  %0 = load %struct.SmallStruct_5b*, %struct.SmallStruct_5b** %ss.addr, align 8
206  %1 = bitcast { i40 }* %.coerce to i8*
207  %2 = bitcast %struct.SmallStruct_5b* %0 to i8*
208  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 5, i32 0, i1 false)
209  %3 = getelementptr { i40 }, { i40 }* %.coerce, i32 0, i32 0
210  %4 = load i40, i40* %3, align 1
211  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i40 inreg %4)
212  ret void
213 ; CHECK-LABEL: smallStruct_5b:
214 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 24
215}
216
217define void @smallStruct_6b(%struct.SmallStruct_6b* %ss) #0 {
218entry:
219  %ss.addr = alloca %struct.SmallStruct_6b*, align 8
220  %.coerce = alloca { i48 }
221  store %struct.SmallStruct_6b* %ss, %struct.SmallStruct_6b** %ss.addr, align 8
222  %0 = load %struct.SmallStruct_6b*, %struct.SmallStruct_6b** %ss.addr, align 8
223  %1 = bitcast { i48 }* %.coerce to i8*
224  %2 = bitcast %struct.SmallStruct_6b* %0 to i8*
225  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 6, i32 0, i1 false)
226  %3 = getelementptr { i48 }, { i48 }* %.coerce, i32 0, i32 0
227  %4 = load i48, i48* %3, align 1
228  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i48 inreg %4)
229  ret void
230 ; CHECK-LABEL: smallStruct_6b:
231 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 16
232}
233
234define void @smallStruct_7b(%struct.SmallStruct_7b* %ss) #0 {
235entry:
236  %ss.addr = alloca %struct.SmallStruct_7b*, align 8
237  %.coerce = alloca { i56 }
238  store %struct.SmallStruct_7b* %ss, %struct.SmallStruct_7b** %ss.addr, align 8
239  %0 = load %struct.SmallStruct_7b*, %struct.SmallStruct_7b** %ss.addr, align 8
240  %1 = bitcast { i56 }* %.coerce to i8*
241  %2 = bitcast %struct.SmallStruct_7b* %0 to i8*
242  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 7, i32 0, i1 false)
243  %3 = getelementptr { i56 }, { i56 }* %.coerce, i32 0, i32 0
244  %4 = load i56, i56* %3, align 1
245  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i56 inreg %4)
246  ret void
247 ; CHECK-LABEL: smallStruct_7b:
248 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 8
249}
250
251define void @smallStruct_8b(%struct.SmallStruct_8b* %ss) #0 {
252entry:
253  %ss.addr = alloca %struct.SmallStruct_8b*, align 8
254  store %struct.SmallStruct_8b* %ss, %struct.SmallStruct_8b** %ss.addr, align 8
255  %0 = load %struct.SmallStruct_8b*, %struct.SmallStruct_8b** %ss.addr, align 8
256  %1 = bitcast %struct.SmallStruct_8b* %0 to { i64 }*
257  %2 = getelementptr { i64 }, { i64 }* %1, i32 0, i32 0
258  %3 = load i64, i64* %2, align 1
259  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %3)
260  ret void
261 ; CHECK-LABEL: smallStruct_8b:
262 ; CHECK-NOT: dsll
263}
264
265define void @smallStruct_9b(%struct.SmallStruct_9b* %ss) #0 {
266entry:
267  %ss.addr = alloca %struct.SmallStruct_9b*, align 8
268  %.coerce = alloca { i64, i8 }
269  store %struct.SmallStruct_9b* %ss, %struct.SmallStruct_9b** %ss.addr, align 8
270  %0 = load %struct.SmallStruct_9b*, %struct.SmallStruct_9b** %ss.addr, align 8
271  %1 = bitcast { i64, i8 }* %.coerce to i8*
272  %2 = bitcast %struct.SmallStruct_9b* %0 to i8*
273  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 9, i32 0, i1 false)
274  %3 = getelementptr { i64, i8 }, { i64, i8 }* %.coerce, i32 0, i32 0
275  %4 = load i64, i64* %3, align 1
276  %5 = getelementptr { i64, i8 }, { i64, i8 }* %.coerce, i32 0, i32 1
277  %6 = load i8, i8* %5, align 1
278  call void (i8*, ...) @varArgF_SmallStruct(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 inreg %4, i8 inreg %6)
279  ret void
280 ; CHECK-LABEL: smallStruct_9b:
281 ; CHECK: dsll $[[R1:[0-9]+]], $[[R2:[0-9]+]], 56
282}
283