1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; NOTE: The SelectionDAG checks have been added by hand.
3
4; RUN: llc < %s -mtriple=mips-linux-gnu -verify-machineinstrs  \
5; RUN:   | FileCheck %s --check-prefix=O32
6; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n32 -verify-machineinstrs \
7; RUN:    | FileCheck %s --check-prefix=N32
8; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n64 -verify-machineinstrs \
9; RUN:    | FileCheck %s --check-prefix=N64
10
11; RUN: llc < %s -mtriple=mips-linux-gnu -verify-machineinstrs -debug 2>&1 \
12; RUN:   | FileCheck %s --check-prefix=O32-SDAG
13; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n32 -verify-machineinstrs \
14; RUN:   -debug 2>&1 | FileCheck %s --check-prefix=N32-SDAG
15; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n64 -verify-machineinstrs \
16; RUN:   -debug 2>&1 | FileCheck %s --check-prefix=N64-SDAG
17
18; REQUIRES: asserts
19
20; Test that reserved argument area is shared between the memcpy call and the
21; call to f2. This eliminates the nested call sequence nodes.
22
23; Also, test that a basic call to memcpy reserves its outgoing argument area.
24
25; FIXME: We should also be explicit about testing that the loads for the
26;        arguments are scheduled after the memcpy, but that wasn't enforced in
27;        this patch.
28
29%struct.S1 = type { [65520 x i8] }
30
31; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
32; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
33; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
34; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
35; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
36; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
37; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
38
39; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
40; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
41; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
42; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
43; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
44; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
45; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
46
47; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
48; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
49; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
50; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
51; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
52; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i64<void (%struct.S1*)* @f2>
53; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
54
55define dso_local void @g() #0 {
56; O32-LABEL: g:
57; O32:       # %bb.0: # %entry
58; O32-NEXT:    lui $1, 1
59; O32-NEXT:    subu $sp, $sp, $1
60; O32-NEXT:    .cfi_def_cfa_offset 65536
61; O32-NEXT:    lui $1, 1
62; O32-NEXT:    addu $1, $sp, $1
63; O32-NEXT:    sw $ra, -4($1) # 4-byte Folded Spill
64; O32-NEXT:    .cfi_offset 31, -4
65; O32-NEXT:    ori $1, $zero, 65520
66; O32-NEXT:    subu $sp, $sp, $1
67; O32-NEXT:    addiu $1, $sp, 8
68; O32-NEXT:    addiu $5, $1, 16
69; O32-NEXT:    addiu $4, $sp, 16
70; O32-NEXT:    jal memcpy
71; O32-NEXT:    ori $6, $zero, 65504
72; O32-NEXT:    lw $7, 20($sp)
73; O32-NEXT:    lw $6, 16($sp)
74; O32-NEXT:    lw $5, 12($sp)
75; O32-NEXT:    jal f2
76; O32-NEXT:    lw $4, 8($sp)
77; O32-NEXT:    ori $1, $zero, 65520
78; O32-NEXT:    addu $sp, $sp, $1
79; O32-NEXT:    lui $1, 1
80; O32-NEXT:    addu $1, $sp, $1
81; O32-NEXT:    lw $ra, -4($1) # 4-byte Folded Reload
82; O32-NEXT:    lui $1, 1
83; O32-NEXT:    jr $ra
84; O32-NEXT:    addu $sp, $sp, $1
85;
86; N32-LABEL: g:
87; N32:       # %bb.0: # %entry
88; N32-NEXT:    lui $1, 1
89; N32-NEXT:    subu $sp, $sp, $1
90; N32-NEXT:    .cfi_def_cfa_offset 65536
91; N32-NEXT:    lui $1, 1
92; N32-NEXT:    addu $1, $sp, $1
93; N32-NEXT:    sd $ra, -8($1) # 8-byte Folded Spill
94; N32-NEXT:    .cfi_offset 31, -8
95; N32-NEXT:    ori $1, $zero, 65456
96; N32-NEXT:    subu $sp, $sp, $1
97; N32-NEXT:    addiu $1, $sp, 8
98; N32-NEXT:    addiu $5, $1, 64
99; N32-NEXT:    ori $6, $zero, 65456
100; N32-NEXT:    jal memcpy
101; N32-NEXT:    move $4, $sp
102; N32-NEXT:    ld $11, 64($sp)
103; N32-NEXT:    ld $10, 56($sp)
104; N32-NEXT:    ld $9, 48($sp)
105; N32-NEXT:    ld $8, 40($sp)
106; N32-NEXT:    ld $7, 32($sp)
107; N32-NEXT:    ld $6, 24($sp)
108; N32-NEXT:    ld $5, 16($sp)
109; N32-NEXT:    jal f2
110; N32-NEXT:    ld $4, 8($sp)
111; N32-NEXT:    ori $1, $zero, 65456
112; N32-NEXT:    addu $sp, $sp, $1
113; N32-NEXT:    lui $1, 1
114; N32-NEXT:    addu $1, $sp, $1
115; N32-NEXT:    ld $ra, -8($1) # 8-byte Folded Reload
116; N32-NEXT:    lui $1, 1
117; N32-NEXT:    jr $ra
118; N32-NEXT:    addu $sp, $sp, $1
119;
120; N64-LABEL: g:
121; N64:       # %bb.0: # %entry
122; N64-NEXT:    lui $1, 1
123; N64-NEXT:    dsubu $sp, $sp, $1
124; N64-NEXT:    .cfi_def_cfa_offset 65536
125; N64-NEXT:    lui $1, 1
126; N64-NEXT:    daddu $1, $sp, $1
127; N64-NEXT:    sd $ra, -8($1) # 8-byte Folded Spill
128; N64-NEXT:    .cfi_offset 31, -8
129; N64-NEXT:    ori $1, $zero, 65456
130; N64-NEXT:    dsubu $sp, $sp, $1
131; N64-NEXT:    daddiu $1, $sp, 8
132; N64-NEXT:    daddiu $5, $1, 64
133; N64-NEXT:    ori $6, $zero, 65456
134; N64-NEXT:    jal memcpy
135; N64-NEXT:    move $4, $sp
136; N64-NEXT:    ld $11, 64($sp)
137; N64-NEXT:    ld $10, 56($sp)
138; N64-NEXT:    ld $9, 48($sp)
139; N64-NEXT:    ld $8, 40($sp)
140; N64-NEXT:    ld $7, 32($sp)
141; N64-NEXT:    ld $6, 24($sp)
142; N64-NEXT:    ld $5, 16($sp)
143; N64-NEXT:    jal f2
144; N64-NEXT:    ld $4, 8($sp)
145; N64-NEXT:    ori $1, $zero, 65456
146; N64-NEXT:    daddu $sp, $sp, $1
147; N64-NEXT:    lui $1, 1
148; N64-NEXT:    daddu $1, $sp, $1
149; N64-NEXT:    ld $ra, -8($1) # 8-byte Folded Reload
150; N64-NEXT:    lui $1, 1
151; N64-NEXT:    jr $ra
152; N64-NEXT:    daddu $sp, $sp, $1
153entry:
154  %a = alloca %struct.S1, align 4
155  call void @f2(%struct.S1* byval align 4 %a)
156  ret void
157}
158
159declare dso_local void @f2(%struct.S1* byval align 4) #1
160
161; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
162; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
163; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
164; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
165; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
166; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
167; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
168; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
169; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
170; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
171
172; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
173; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
174; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
175; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
176; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
177; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
178; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
179; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
180; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
181; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
182
183; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
184; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
185; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
186; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
187; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
188; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
189; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
190; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
191; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i64<void (%struct.S1*)* @f2>
192; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
193
194define dso_local void @g2(%struct.S1* %a) {
195; O32-LABEL: g2:
196; O32:       # %bb.0: # %entry
197; O32-NEXT:    lui $1, 1
198; O32-NEXT:    addiu $1, $1, 8
199; O32-NEXT:    subu $sp, $sp, $1
200; O32-NEXT:    .cfi_def_cfa_offset 65544
201; O32-NEXT:    lui $1, 1
202; O32-NEXT:    addu $1, $sp, $1
203; O32-NEXT:    sw $ra, 4($1) # 4-byte Folded Spill
204; O32-NEXT:    lui $1, 1
205; O32-NEXT:    addu $1, $sp, $1
206; O32-NEXT:    sw $16, 0($1) # 4-byte Folded Spill
207; O32-NEXT:    .cfi_offset 31, -4
208; O32-NEXT:    .cfi_offset 16, -8
209; O32-NEXT:    move $5, $4
210; O32-NEXT:    lui $1, 1
211; O32-NEXT:    addu $1, $sp, $1
212; O32-NEXT:    sw $4, -4($1)
213; O32-NEXT:    addiu $sp, $sp, -16
214; O32-NEXT:    addiu $16, $sp, 8
215; O32-NEXT:    ori $6, $zero, 65520
216; O32-NEXT:    jal memcpy
217; O32-NEXT:    move $4, $16
218; O32-NEXT:    addiu $sp, $sp, 16
219; O32-NEXT:    ori $1, $zero, 65520
220; O32-NEXT:    subu $sp, $sp, $1
221; O32-NEXT:    addiu $5, $16, 16
222; O32-NEXT:    addiu $4, $sp, 16
223; O32-NEXT:    jal memcpy
224; O32-NEXT:    ori $6, $zero, 65504
225; O32-NEXT:    lw $7, 20($sp)
226; O32-NEXT:    lw $6, 16($sp)
227; O32-NEXT:    lw $5, 12($sp)
228; O32-NEXT:    jal f2
229; O32-NEXT:    lw $4, 8($sp)
230; O32-NEXT:    ori $1, $zero, 65520
231; O32-NEXT:    addu $sp, $sp, $1
232; O32-NEXT:    lui $1, 1
233; O32-NEXT:    addu $1, $sp, $1
234; O32-NEXT:    lw $16, 0($1) # 4-byte Folded Reload
235; O32-NEXT:    lui $1, 1
236; O32-NEXT:    addu $1, $sp, $1
237; O32-NEXT:    lw $ra, 4($1) # 4-byte Folded Reload
238; O32-NEXT:    lui $1, 1
239; O32-NEXT:    addiu $1, $1, 8
240; O32-NEXT:    jr $ra
241; O32-NEXT:    addu $sp, $sp, $1
242;
243; N32-LABEL: g2:
244; N32:       # %bb.0: # %entry
245; N32-NEXT:    lui $1, 1
246; N32-NEXT:    addiu $1, $1, 16
247; N32-NEXT:    subu $sp, $sp, $1
248; N32-NEXT:    .cfi_def_cfa_offset 65552
249; N32-NEXT:    lui $1, 1
250; N32-NEXT:    addu $1, $sp, $1
251; N32-NEXT:    sd $ra, 8($1) # 8-byte Folded Spill
252; N32-NEXT:    lui $1, 1
253; N32-NEXT:    addu $1, $sp, $1
254; N32-NEXT:    sd $16, 0($1) # 8-byte Folded Spill
255; N32-NEXT:    .cfi_offset 31, -8
256; N32-NEXT:    .cfi_offset 16, -16
257; N32-NEXT:    move $5, $4
258; N32-NEXT:    sll $1, $5, 0
259; N32-NEXT:    lui $2, 1
260; N32-NEXT:    addu $2, $sp, $2
261; N32-NEXT:    sw $1, -4($2)
262; N32-NEXT:    addiu $16, $sp, 8
263; N32-NEXT:    ori $6, $zero, 65520
264; N32-NEXT:    jal memcpy
265; N32-NEXT:    move $4, $16
266; N32-NEXT:    addiu $5, $16, 64
267; N32-NEXT:    ori $1, $zero, 65456
268; N32-NEXT:    subu $sp, $sp, $1
269; N32-NEXT:    ori $6, $zero, 65456
270; N32-NEXT:    jal memcpy
271; N32-NEXT:    move $4, $sp
272; N32-NEXT:    ld $11, 64($sp)
273; N32-NEXT:    ld $10, 56($sp)
274; N32-NEXT:    ld $9, 48($sp)
275; N32-NEXT:    ld $8, 40($sp)
276; N32-NEXT:    ld $7, 32($sp)
277; N32-NEXT:    ld $6, 24($sp)
278; N32-NEXT:    ld $5, 16($sp)
279; N32-NEXT:    jal f2
280; N32-NEXT:    ld $4, 8($sp)
281; N32-NEXT:    ori $1, $zero, 65456
282; N32-NEXT:    addu $sp, $sp, $1
283; N32-NEXT:    lui $1, 1
284; N32-NEXT:    addu $1, $sp, $1
285; N32-NEXT:    ld $16, 0($1) # 8-byte Folded Reload
286; N32-NEXT:    lui $1, 1
287; N32-NEXT:    addu $1, $sp, $1
288; N32-NEXT:    ld $ra, 8($1) # 8-byte Folded Reload
289; N32-NEXT:    lui $1, 1
290; N32-NEXT:    addiu $1, $1, 16
291; N32-NEXT:    jr $ra
292; N32-NEXT:    addu $sp, $sp, $1
293;
294; N64-LABEL: g2:
295; N64:       # %bb.0: # %entry
296; N64-NEXT:    lui $1, 1
297; N64-NEXT:    daddiu $1, $1, 16
298; N64-NEXT:    dsubu $sp, $sp, $1
299; N64-NEXT:    .cfi_def_cfa_offset 65552
300; N64-NEXT:    lui $1, 1
301; N64-NEXT:    daddu $1, $sp, $1
302; N64-NEXT:    sd $ra, 8($1) # 8-byte Folded Spill
303; N64-NEXT:    lui $1, 1
304; N64-NEXT:    daddu $1, $sp, $1
305; N64-NEXT:    sd $16, 0($1) # 8-byte Folded Spill
306; N64-NEXT:    .cfi_offset 31, -8
307; N64-NEXT:    .cfi_offset 16, -16
308; N64-NEXT:    move $5, $4
309; N64-NEXT:    lui $1, 1
310; N64-NEXT:    daddu $1, $sp, $1
311; N64-NEXT:    sd $4, -8($1)
312; N64-NEXT:    daddiu $16, $sp, 8
313; N64-NEXT:    ori $6, $zero, 65520
314; N64-NEXT:    jal memcpy
315; N64-NEXT:    move $4, $16
316; N64-NEXT:    ori $1, $zero, 65456
317; N64-NEXT:    dsubu $sp, $sp, $1
318; N64-NEXT:    daddiu $5, $16, 64
319; N64-NEXT:    ori $6, $zero, 65456
320; N64-NEXT:    jal memcpy
321; N64-NEXT:    move $4, $sp
322; N64-NEXT:    ld $11, 64($sp)
323; N64-NEXT:    ld $10, 56($sp)
324; N64-NEXT:    ld $9, 48($sp)
325; N64-NEXT:    ld $8, 40($sp)
326; N64-NEXT:    ld $7, 32($sp)
327; N64-NEXT:    ld $6, 24($sp)
328; N64-NEXT:    ld $5, 16($sp)
329; N64-NEXT:    jal f2
330; N64-NEXT:    ld $4, 8($sp)
331; N64-NEXT:    ori $1, $zero, 65456
332; N64-NEXT:    daddu $sp, $sp, $1
333; N64-NEXT:    lui $1, 1
334; N64-NEXT:    daddu $1, $sp, $1
335; N64-NEXT:    ld $16, 0($1) # 8-byte Folded Reload
336; N64-NEXT:    lui $1, 1
337; N64-NEXT:    daddu $1, $sp, $1
338; N64-NEXT:    ld $ra, 8($1) # 8-byte Folded Reload
339; N64-NEXT:    lui $1, 1
340; N64-NEXT:    daddiu $1, $1, 16
341; N64-NEXT:    jr $ra
342; N64-NEXT:    daddu $sp, $sp, $1
343entry:
344  %a.addr = alloca %struct.S1*, align 4
345  %byval-temp = alloca %struct.S1, align 4
346  store %struct.S1* %a, %struct.S1** %a.addr, align 4
347  %0 = load %struct.S1*, %struct.S1** %a.addr, align 4
348  %1 = bitcast %struct.S1* %byval-temp to i8*
349  %2 = bitcast %struct.S1* %0 to i8*
350  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 1 %2, i32 65520, i1 false)
351  call void @f2(%struct.S1* byval align 4 %byval-temp)
352  ret void
353}
354
355; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
356; O32-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<16>
357; O32-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
358; O32-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<16>
359
360; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
361; N32-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<0>
362; N32-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
363; N32-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<0>
364
365; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
366; N64-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<0>
367; N64-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
368; N64-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<0>
369
370define dso_local i32 @g3(%struct.S1* %a, %struct.S1* %b) #0 {
371; O32-LABEL: g3:
372; O32:       # %bb.0: # %entry
373; O32-NEXT:    addiu $sp, $sp, -32
374; O32-NEXT:    .cfi_def_cfa_offset 32
375; O32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
376; O32-NEXT:    .cfi_offset 31, -4
377; O32-NEXT:    sw $5, 20($sp)
378; O32-NEXT:    sw $4, 24($sp)
379; O32-NEXT:    jal memcpy
380; O32-NEXT:    ori $6, $zero, 65520
381; O32-NEXT:    addiu $2, $zero, 4
382; O32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
383; O32-NEXT:    jr $ra
384; O32-NEXT:    addiu $sp, $sp, 32
385;
386; N32-LABEL: g3:
387; N32:       # %bb.0: # %entry
388; N32-NEXT:    addiu $sp, $sp, -16
389; N32-NEXT:    .cfi_def_cfa_offset 16
390; N32-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
391; N32-NEXT:    .cfi_offset 31, -8
392; N32-NEXT:    sll $1, $5, 0
393; N32-NEXT:    sw $1, 0($sp)
394; N32-NEXT:    sll $1, $4, 0
395; N32-NEXT:    sw $1, 4($sp)
396; N32-NEXT:    jal memcpy
397; N32-NEXT:    ori $6, $zero, 65520
398; N32-NEXT:    addiu $2, $zero, 4
399; N32-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
400; N32-NEXT:    jr $ra
401; N32-NEXT:    addiu $sp, $sp, 16
402;
403; N64-LABEL: g3:
404; N64:       # %bb.0: # %entry
405; N64-NEXT:    daddiu $sp, $sp, -32
406; N64-NEXT:    .cfi_def_cfa_offset 32
407; N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
408; N64-NEXT:    .cfi_offset 31, -8
409; N64-NEXT:    sd $5, 8($sp)
410; N64-NEXT:    sd $4, 16($sp)
411; N64-NEXT:    jal memcpy
412; N64-NEXT:    ori $6, $zero, 65520
413; N64-NEXT:    addiu $2, $zero, 4
414; N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
415; N64-NEXT:    jr $ra
416; N64-NEXT:    daddiu $sp, $sp, 32
417entry:
418  %a.addr = alloca %struct.S1*, align 4
419  %b.addr = alloca %struct.S1*, align 4
420  store %struct.S1* %a, %struct.S1** %a.addr, align 4
421  store %struct.S1* %b, %struct.S1** %b.addr, align 4
422  %0 = load %struct.S1*, %struct.S1** %a.addr, align 4
423  %1 = bitcast %struct.S1* %0 to i8*
424  %2 = load %struct.S1*, %struct.S1** %b.addr, align 4
425  %3 = bitcast %struct.S1* %2 to i8*
426  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 1 %3, i32 65520, i1 false)
427  ret i32 4
428}
429
430declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i1) #2
431