• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -march=x86 < %s | FileCheck %s
2; RUN: llc -march=x86 -O0 < %s | FileCheck %s
3; RUN: llc -march=x86 -disable-tail-calls < %s | FileCheck %s
4
5declare void @t1_callee(i8*)
6define void @t1(i32* %a) {
7; CHECK-LABEL: t1:
8; CHECK: jmp {{_?}}t1_callee
9  %b = bitcast i32* %a to i8*
10  musttail call void @t1_callee(i8* %b)
11  ret void
12}
13
14declare i8* @t2_callee()
15define i32* @t2() {
16; CHECK-LABEL: t2:
17; CHECK: jmp {{_?}}t2_callee
18  %v = musttail call i8* @t2_callee()
19  %w = bitcast i8* %v to i32*
20  ret i32* %w
21}
22
23; Complex frame layout: stack realignment with dynamic alloca.
24define void @t3(i32 %n) alignstack(32) nounwind {
25entry:
26; CHECK: t3:
27; CHECK: pushl %ebp
28; CHECK: pushl %esi
29; CHECK: andl $-32, %esp
30; CHECK: movl %esp, %esi
31; CHECK: popl %esi
32; CHECK: popl %ebp
33; CHECK-NEXT: jmp {{_?}}t3_callee
34  %a = alloca i8, i32 %n
35  call void @capture(i8* %a)
36  musttail call void @t3_callee(i32 %n) nounwind
37  ret void
38}
39
40declare void @capture(i8*)
41declare void @t3_callee(i32)
42
43; Test that we actually copy in and out stack arguments that aren't forwarded
44; without modification.
45define i32 @t4({}* %fn, i32 %n, i32 %r) {
46; CHECK-LABEL: t4:
47; CHECK: incl %[[r:.*]]
48; CHECK: decl %[[n:.*]]
49; CHECK: movl %[[r]], {{[0-9]+}}(%esp)
50; CHECK: movl %[[n]], {{[0-9]+}}(%esp)
51; CHECK: jmpl *%{{.*}}
52
53entry:
54  %r1 = add i32 %r, 1
55  %n1 = sub i32 %n, 1
56  %fn_cast = bitcast {}* %fn to i32 ({}*, i32, i32)*
57  %r2 = musttail call i32 %fn_cast({}* %fn, i32 %n1, i32 %r1)
58  ret i32 %r2
59}
60
61; Combine the complex stack frame with the parameter modification.
62define i32 @t5({}* %fn, i32 %n, i32 %r) alignstack(32) {
63; CHECK-LABEL: t5:
64; CHECK: pushl %ebp
65; CHECK: movl %esp, %ebp
66; CHECK: pushl %esi
67; 	Align the stack.
68; CHECK: andl $-32, %esp
69; CHECK: movl %esp, %esi
70; 	Modify the args.
71; CHECK: incl %[[r:.*]]
72; CHECK: decl %[[n:.*]]
73; 	Store them through ebp, since that's the only stable arg pointer.
74; CHECK: movl %[[r]], {{[0-9]+}}(%ebp)
75; CHECK: movl %[[n]], {{[0-9]+}}(%ebp)
76; 	Epilogue.
77; CHECK: leal {{[-0-9]+}}(%ebp), %esp
78; CHECK: popl %esi
79; CHECK: popl %ebp
80; CHECK: jmpl *%{{.*}}
81
82entry:
83  %a = alloca i8, i32 %n
84  call void @capture(i8* %a)
85  %r1 = add i32 %r, 1
86  %n1 = sub i32 %n, 1
87  %fn_cast = bitcast {}* %fn to i32 ({}*, i32, i32)*
88  %r2 = musttail call i32 %fn_cast({}* %fn, i32 %n1, i32 %r1)
89  ret i32 %r2
90}
91