@@ -21,16 +21,15 @@ define void @caller1(ptr %a) {
2121; X64-NEXT: .cfi_def_cfa_offset 32
2222; X64-NEXT: pushq %r12
2323; X64-NEXT: .cfi_def_cfa_offset 40
24- ; X64-NEXT: pushq %rbx
24+ ; X64-NEXT: pushq %rax
2525; X64-NEXT: .cfi_def_cfa_offset 48
26- ; X64-NEXT: .cfi_offset %rbx, -48
2726; X64-NEXT: .cfi_offset %r12, -40
2827; X64-NEXT: .cfi_offset %r13, -32
2928; X64-NEXT: .cfi_offset %r14, -24
3029; X64-NEXT: .cfi_offset %r15, -16
3130; X64-NEXT: movq %rdi, %r12
3231; X64-NEXT: callq callee@PLT
33- ; X64-NEXT: popq %rbx
32+ ; X64-NEXT: addq $8, %rsp
3433; X64-NEXT: .cfi_def_cfa_offset 40
3534; X64-NEXT: popq %r12
3635; X64-NEXT: .cfi_def_cfa_offset 32
@@ -48,15 +47,10 @@ define void @caller1(ptr %a) {
4847; X86-NEXT: .cfi_def_cfa_offset 8
4948; X86-NEXT: pushl %edi
5049; X86-NEXT: .cfi_def_cfa_offset 12
51- ; X86-NEXT: pushl %esi
52- ; X86-NEXT: .cfi_def_cfa_offset 16
53- ; X86-NEXT: .cfi_offset %esi, -16
5450; X86-NEXT: .cfi_offset %edi, -12
5551; X86-NEXT: .cfi_offset %ebx, -8
5652; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
5753; X86-NEXT: calll callee@PLT
58- ; X86-NEXT: popl %esi
59- ; X86-NEXT: .cfi_def_cfa_offset 12
6054; X86-NEXT: popl %edi
6155; X86-NEXT: .cfi_def_cfa_offset 8
6256; X86-NEXT: popl %ebx
@@ -106,16 +100,14 @@ define preserve_nonecc i64 @callee_with_12_params(i64 %a1, i64 %a2, i64 %a3, i64
106100;
107101; X86-LABEL: callee_with_12_params:
108102; X86: # %bb.0:
109- ; X86-NEXT: pushl %ebp
110- ; X86-NEXT: .cfi_def_cfa_offset 8
111- ; X86-NEXT: .cfi_offset %ebp, -8
112- ; X86-NEXT: movl %edx, %edi
113- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
114- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
115- ; X86-NEXT: movl %ecx, %esi
116- ; X86-NEXT: movl %eax, %edx
117- ; X86-NEXT: movl %ebx, %ecx
118- ; X86-NEXT: movl %ebp, %eax
103+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
104+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
105+ ; X86-NEXT: movl %eax, %edi
106+ ; X86-NEXT: movl %ecx, %eax
107+ ; X86-NEXT: pushl {{[0-9]+}}(%esp)
108+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
109+ ; X86-NEXT: pushl {{[0-9]+}}(%esp)
110+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
119111; X86-NEXT: pushl {{[0-9]+}}(%esp)
120112; X86-NEXT: .cfi_adjust_cfa_offset 4
121113; X86-NEXT: pushl {{[0-9]+}}(%esp)
@@ -151,10 +143,8 @@ define preserve_nonecc i64 @callee_with_12_params(i64 %a1, i64 %a2, i64 %a3, i64
151143; X86-NEXT: pushl {{[0-9]+}}(%esp)
152144; X86-NEXT: .cfi_adjust_cfa_offset 4
153145; X86-NEXT: calll callee_with_11_params@PLT
154- ; X86-NEXT: addl $68, %esp
155- ; X86-NEXT: .cfi_adjust_cfa_offset -68
156- ; X86-NEXT: popl %ebp
157- ; X86-NEXT: .cfi_def_cfa_offset 4
146+ ; X86-NEXT: addl $76, %esp
147+ ; X86-NEXT: .cfi_adjust_cfa_offset -76
158148; X86-NEXT: retl
159149 %ret = call preserve_nonecc i64 @callee_with_11_params (i64 %a2 , i64 %a3 , i64 %a4 , i64 %a5 , i64 %a6 , i64 %a7 , i64 %a8 , i64 %a9 , i64 %a10 , i64 %a11 , i64 %a12 )
160150 ret i64 %ret
@@ -171,9 +161,8 @@ define i64 @caller3() {
171161; X64-NEXT: .cfi_def_cfa_offset 32
172162; X64-NEXT: pushq %r12
173163; X64-NEXT: .cfi_def_cfa_offset 40
174- ; X64-NEXT: pushq %rbx
164+ ; X64-NEXT: pushq %rax
175165; X64-NEXT: .cfi_def_cfa_offset 48
176- ; X64-NEXT: .cfi_offset %rbx, -48
177166; X64-NEXT: .cfi_offset %r12, -40
178167; X64-NEXT: .cfi_offset %r13, -32
179168; X64-NEXT: .cfi_offset %r14, -24
@@ -191,7 +180,7 @@ define i64 @caller3() {
191180; X64-NEXT: movl $11, %r11d
192181; X64-NEXT: movl $12, %eax
193182; X64-NEXT: callq callee_with_12_params@PLT
194- ; X64-NEXT: popq %rbx
183+ ; X64-NEXT: addq $8, %rsp
195184; X64-NEXT: .cfi_def_cfa_offset 40
196185; X64-NEXT: popq %r12
197186; X64-NEXT: .cfi_def_cfa_offset 32
@@ -209,16 +198,11 @@ define i64 @caller3() {
209198; X86-NEXT: .cfi_def_cfa_offset 8
210199; X86-NEXT: pushl %edi
211200; X86-NEXT: .cfi_def_cfa_offset 12
212- ; X86-NEXT: pushl %esi
213- ; X86-NEXT: .cfi_def_cfa_offset 16
214- ; X86-NEXT: .cfi_offset %esi, -16
215201; X86-NEXT: .cfi_offset %edi, -12
216202; X86-NEXT: .cfi_offset %ebx, -8
217203; X86-NEXT: movl $1, %edi
218- ; X86-NEXT: xorl %esi, %esi
219- ; X86-NEXT: movl $2, %edx
220- ; X86-NEXT: xorl %ecx, %ecx
221- ; X86-NEXT: movl $3, %eax
204+ ; X86-NEXT: xorl %edx, %edx
205+ ; X86-NEXT: movl $2, %eax
222206; X86-NEXT: pushl $0
223207; X86-NEXT: .cfi_adjust_cfa_offset 4
224208; X86-NEXT: pushl $12
@@ -257,11 +241,13 @@ define i64 @caller3() {
257241; X86-NEXT: .cfi_adjust_cfa_offset 4
258242; X86-NEXT: pushl $0
259243; X86-NEXT: .cfi_adjust_cfa_offset 4
244+ ; X86-NEXT: pushl $3
245+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
246+ ; X86-NEXT: pushl $0
247+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
260248; X86-NEXT: calll callee_with_12_params@PLT
261- ; X86-NEXT: addl $76, %esp
262- ; X86-NEXT: .cfi_adjust_cfa_offset -76
263- ; X86-NEXT: popl %esi
264- ; X86-NEXT: .cfi_def_cfa_offset 12
249+ ; X86-NEXT: addl $84, %esp
250+ ; X86-NEXT: .cfi_adjust_cfa_offset -84
265251; X86-NEXT: popl %edi
266252; X86-NEXT: .cfi_def_cfa_offset 8
267253; X86-NEXT: popl %ebx
@@ -288,11 +274,15 @@ define preserve_nonecc i32 @callee_with_5_params(i32 %a1, i32 %a2, i32 %a3, i32
288274;
289275; X86-LABEL: callee_with_5_params:
290276; X86: # %bb.0:
291- ; X86-NEXT: movl %esi, %edi
292- ; X86-NEXT: movl %edx, %esi
293- ; X86-NEXT: movl %ecx, %edx
294- ; X86-NEXT: movl %eax, %ecx
277+ ; X86-NEXT: movl %edx, %edi
278+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
279+ ; X86-NEXT: movl %eax, %edx
280+ ; X86-NEXT: movl %ecx, %eax
281+ ; X86-NEXT: pushl {{[0-9]+}}(%esp)
282+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
295283; X86-NEXT: calll callee_with_4_params@PLT
284+ ; X86-NEXT: addl $4, %esp
285+ ; X86-NEXT: .cfi_adjust_cfa_offset -4
296286; X86-NEXT: retl
297287 %ret = call preserve_nonecc i32 @callee_with_4_params (i32 %a2 , i32 %a3 , i32 %a4 , i32 %a5 )
298288 ret i32 %ret
@@ -309,9 +299,8 @@ define i32 @caller4() {
309299; X64-NEXT: .cfi_def_cfa_offset 32
310300; X64-NEXT: pushq %r12
311301; X64-NEXT: .cfi_def_cfa_offset 40
312- ; X64-NEXT: pushq %rbx
302+ ; X64-NEXT: pushq %rax
313303; X64-NEXT: .cfi_def_cfa_offset 48
314- ; X64-NEXT: .cfi_offset %rbx, -48
315304; X64-NEXT: .cfi_offset %r12, -40
316305; X64-NEXT: .cfi_offset %r13, -32
317306; X64-NEXT: .cfi_offset %r14, -24
@@ -322,7 +311,7 @@ define i32 @caller4() {
322311; X64-NEXT: movl $4, %r15d
323312; X64-NEXT: movl $5, %edi
324313; X64-NEXT: callq callee_with_5_params@PLT
325- ; X64-NEXT: popq %rbx
314+ ; X64-NEXT: addq $8, %rsp
326315; X64-NEXT: .cfi_def_cfa_offset 40
327316; X64-NEXT: popq %r12
328317; X64-NEXT: .cfi_def_cfa_offset 32
@@ -340,19 +329,18 @@ define i32 @caller4() {
340329; X86-NEXT: .cfi_def_cfa_offset 8
341330; X86-NEXT: pushl %edi
342331; X86-NEXT: .cfi_def_cfa_offset 12
343- ; X86-NEXT: pushl %esi
344- ; X86-NEXT: .cfi_def_cfa_offset 16
345- ; X86-NEXT: .cfi_offset %esi, -16
346332; X86-NEXT: .cfi_offset %edi, -12
347333; X86-NEXT: .cfi_offset %ebx, -8
348334; X86-NEXT: movl $1, %edi
349- ; X86-NEXT: movl $2, %esi
350- ; X86-NEXT: movl $3, %edx
351- ; X86-NEXT: movl $4, %ecx
352- ; X86-NEXT: movl $5, %eax
335+ ; X86-NEXT: movl $2, %edx
336+ ; X86-NEXT: movl $3, %eax
337+ ; X86-NEXT: pushl $5
338+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
339+ ; X86-NEXT: pushl $4
340+ ; X86-NEXT: .cfi_adjust_cfa_offset 4
353341; X86-NEXT: calll callee_with_5_params@PLT
354- ; X86-NEXT: popl %esi
355- ; X86-NEXT: .cfi_def_cfa_offset 12
342+ ; X86-NEXT: addl $8, %esp
343+ ; X86-NEXT: .cfi_adjust_cfa_offset -8
356344; X86-NEXT: popl %edi
357345; X86-NEXT: .cfi_def_cfa_offset 8
358346; X86-NEXT: popl %ebx
@@ -377,38 +365,45 @@ define preserve_nonecc void @entry4(ptr %a, ptr %b, ptr %c, ptr %d) {
377365;
378366; X86-LABEL: entry4:
379367; X86: # %bb.0:
380- ; X86-NEXT: pushl %ebp
368+ ; X86-NEXT: pushl %esi
381369; X86-NEXT: .cfi_def_cfa_offset 8
382- ; X86-NEXT: .cfi_offset %ebp, -8
383- ; X86-NEXT: movl %ecx, %ebx
384- ; X86-NEXT: movl %edx, %ebp
370+ ; X86-NEXT: pushl %ebp
371+ ; X86-NEXT: .cfi_def_cfa_offset 12
372+ ; X86-NEXT: .cfi_offset %ebp, -12
373+ ; X86-NEXT: .cfi_offset %esi, -8
374+ ; X86-NEXT: movl %eax, %ebx
375+ ; X86-NEXT: movl %edx, %esi
376+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
385377; X86-NEXT: calll boring@PLT
386- ; X86-NEXT: movl %ebp, %edx
387- ; X86-NEXT: movl %ebx, %ecx
378+ ; X86-NEXT: movl %ebp, {{[0-9]+}}(%esp)
379+ ; X86-NEXT: movl %esi, %edx
380+ ; X86-NEXT: movl %ebx, %eax
388381; X86-NEXT: popl %ebp
382+ ; X86-NEXT: .cfi_def_cfa_offset 8
383+ ; X86-NEXT: popl %esi
389384; X86-NEXT: .cfi_def_cfa_offset 4
390385; X86-NEXT: jmp continuation4@PLT # TAILCALL
391386 call void @boring ()
392387 musttail call preserve_nonecc void @continuation4 (ptr %a , ptr %b , ptr %c , ptr %d )
393388 ret void
394389}
395390
396- declare preserve_nonecc void @continuation2 (ptr , ptr )
397- define preserve_nonecc void @entry2 (ptr %a , ptr %b ) {
398- ; X64-LABEL: entry2 :
391+ declare preserve_nonecc void @continuation1 (ptr , ptr )
392+ define preserve_nonecc void @entry1 (ptr %a ) {
393+ ; X64-LABEL: entry1 :
399394; X64: # %bb.0:
400395; X64-NEXT: pushq %rax
401396; X64-NEXT: .cfi_def_cfa_offset 16
402397; X64-NEXT: callq boring@PLT
403398; X64-NEXT: popq %rax
404399; X64-NEXT: .cfi_def_cfa_offset 8
405- ; X64-NEXT: jmp continuation2 @PLT # TAILCALL
400+ ; X64-NEXT: jmp continuation1 @PLT # TAILCALL
406401;
407- ; X86-LABEL: entry2 :
402+ ; X86-LABEL: entry1 :
408403; X86: # %bb.0:
409404; X86-NEXT: calll boring@PLT
410- ; X86-NEXT: jmp continuation2 @PLT # TAILCALL
405+ ; X86-NEXT: jmp continuation1 @PLT # TAILCALL
411406 call void @boring ()
412- musttail call preserve_nonecc void @continuation2 (ptr %a , ptr %b )
407+ musttail call preserve_nonecc void @continuation1 (ptr %a )
413408 ret void
414409}
0 commit comments