Revert "Change memcpy/memset/memmove to have dest and source alignments."
[oota-llvm.git] / test / CodeGen / Mips / cconv / arguments-varargs-small-structs-byte.ll
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
137 declare void @varArgF_SmallStruct(i8* %c, ...) 
138
139 define void @smallStruct_1b(%struct.SmallStruct_1b* %ss) #0 {
140 entry:
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
153 define void @smallStruct_2b(%struct.SmallStruct_2b* %ss) #0 {
154 entry:
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
167 define void @smallStruct_3b(%struct.SmallStruct_3b* %ss) #0 {
168 entry:
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
184 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1
185
186 define void @smallStruct_4b(%struct.SmallStruct_4b* %ss) #0 {
187 entry:
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
200 define void @smallStruct_5b(%struct.SmallStruct_5b* %ss) #0 {
201 entry:
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
217 define void @smallStruct_6b(%struct.SmallStruct_6b* %ss) #0 {
218 entry:
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
234 define void @smallStruct_7b(%struct.SmallStruct_7b* %ss) #0 {
235 entry:
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
251 define void @smallStruct_8b(%struct.SmallStruct_8b* %ss) #0 {
252 entry:
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
265 define void @smallStruct_9b(%struct.SmallStruct_9b* %ss) #0 {
266 entry:
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 }