1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f1:
; CHECK: movl 48(%rbp), %eax
ret i32 %p5
}
define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f2:
; CHECK: .seh_stackalloc 8
; CHECK: movq %rsp, %rbp
; CHECK: .seh_setframe 5, 0
; CHECK: movq %rdx, 32(%rbp)
; CHECK: leaq 32(%rbp), %rax
%ap = alloca i8, align 8
call void @llvm.va_start(i8* %ap)
ret void
}
define i8* @f3() "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f3:
; CHECK: movq %rsp, %rbp
; CHECK: .seh_setframe 5, 0
; CHECK: movq 8(%rbp), %rax
%ra = call i8* @llvm.returnaddress(i32 0)
ret i8* %ra
}
define i8* @f4() "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f4:
; CHECK: pushq %rbp
; CHECK: .seh_pushreg 5
; CHECK: subq $304, %rsp
; CHECK: .seh_stackalloc 304
; CHECK: leaq 128(%rsp), %rbp
; CHECK: .seh_setframe 5, 128
; CHECK: .seh_endprologue
; CHECK: movq 184(%rbp), %rax
alloca [300 x i8]
%ra = call i8* @llvm.returnaddress(i32 0)
ret i8* %ra
}
declare void @external(i8*)
define void @f5() "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f5:
; CHECK: subq $336, %rsp
; CHECK: .seh_stackalloc 336
; CHECK: leaq 128(%rsp), %rbp
; CHECK: .seh_setframe 5, 128
; CHECK: leaq -92(%rbp), %rcx
; CHECK: callq external
%a = alloca [300 x i8]
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
call void @external(i8* %gep)
ret void
}
define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f6:
; CHECK: subq $336, %rsp
; CHECK: .seh_stackalloc 336
; CHECK: leaq 128(%rsp), %rbp
; CHECK: .seh_setframe 5, 128
; CHECK: leaq -92(%rbp), %rcx
; CHECK: callq external
%a = alloca [300 x i8]
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
call void @external(i8* %gep)
ret void
}
define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f7:
; CHECK: pushq %rbp
; CHECK: .seh_pushreg 5
; CHECK: subq $304, %rsp
; CHECK: .seh_stackalloc 304
; CHECK: leaq 128(%rsp), %rbp
; CHECK: .seh_setframe 5, 128
; CHECK: andq $-64, %rsp
; CHECK: movl 224(%rbp), %eax
; CHECK: leaq 176(%rbp), %rsp
alloca [300 x i8], align 64
ret i32 %e
}
define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
; CHECK-LABEL: f8:
; CHECK: subq $352, %rsp
; CHECK: .seh_stackalloc 352
; CHECK: leaq 128(%rsp), %rbp
; CHECK: .seh_setframe 5, 128
%alloca = alloca [300 x i8], align 64
; CHECK: andq $-64, %rsp
; CHECK: movq %rsp, %rbx
alloca i32, i32 %a
; CHECK: movl %ecx, %eax
; CHECK: leaq 15(,%rax,4), %rax
; CHECK: andq $-16, %rax
; CHECK: callq __chkstk
; CHECK: subq %rax, %rsp
%gep = getelementptr [300 x i8]* %alloca, i32 0, i32 0
call void @external(i8* %gep)
; CHECK: subq $32, %rsp
; CHECK: leaq (%rbx), %rcx
; CHECK: callq external
; CHECK: addq $32, %rsp
ret i32 %e
; CHECK: movl %esi, %eax
; CHECK: leaq 224(%rbp), %rsp
}
declare i8* @llvm.returnaddress(i32) nounwind readnone
declare void @llvm.va_start(i8*) nounwind
|