1 ; RUN: llc -mtriple=thumbv4t-none--eabi < %s | FileCheck %s --check-prefix=CHECK-V4T
2 ; RUN: llc -mtriple=thumbv5t-none--eabi < %s | FileCheck %s --check-prefix=CHECK-V5T
4 ; CHECK-V4T-LABEL: clobberframe
5 ; CHECK-V5T-LABEL: clobberframe
6 define <4 x i32> @clobberframe() #0 {
10 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
12 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
14 %b = alloca <4 x i32>, align 16
15 %a = alloca <4 x i32>, align 16
16 store <4 x i32> <i32 42, i32 42, i32 42, i32 42>, <4 x i32>* %b, align 16
17 store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %a, align 16
18 %0 = load <4 x i32>* %a, align 16
24 ; CHECK-V4T-NEXT: pop {[[SAVED]]}
25 ; CHECK-V4T-NEXT: mov r12, r3
26 ; CHECK-V4T-NEXT: pop {r3}
27 ; CHECK-V4T-NEXT: mov lr, r3
28 ; CHECK-V4T-NEXT: mov r3, r12
30 ; CHECK-V5T: pop {[[SAVED]], pc}
33 ; CHECK-V4T-LABEL: clobbervariadicframe
34 ; CHECK-V5T-LABEL: clobbervariadicframe
35 define <4 x i32> @clobbervariadicframe(i32 %i, ...) #0 {
40 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
42 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
44 %b = alloca <4 x i32>, align 16
45 %a = alloca <4 x i32>, align 16
46 store <4 x i32> <i32 42, i32 42, i32 42, i32 42>, <4 x i32>* %b, align 16
47 store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %a, align 16
48 %0 = load <4 x i32>* %a, align 16
49 call void @llvm.va_start(i8* null)
54 ; CHECK-V4T: pop {[[SAVED]]}
55 ; CHECK-V4T-NEXT: mov r12, r3
56 ; CHECK-V4T-NEXT: pop {r3}
57 ; CHECK-V4T-NEXT: add sp,
58 ; CHECK-V4T-NEXT: mov lr, r3
59 ; CHECK-V4T-NEXT: mov r3, r12
62 ; CHECK-V5T-NEXT: pop {[[SAVED]]}
63 ; CHECK-V5T-NEXT: mov r12, r3
64 ; CHECK-V5T-NEXT: pop {r3}
65 ; CHECK-V5T-NEXT: add sp,
66 ; CHECK-V5T-NEXT: mov lr, r3
67 ; CHECK-V5T-NEXT: mov r3, r12
68 ; CHECK-V5T-NEXT: bx lr
71 ; CHECK-V4T-LABEL: simpleframe
72 ; CHECK-V5T-LABEL: simpleframe
73 define i32 @simpleframe() #0 {
77 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
78 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
80 %a = alloca i32, align 4
81 %b = alloca i32, align 4
82 %c = alloca i32, align 4
83 %d = alloca i32, align 4
84 store i32 1, i32* %a, align 4
85 store i32 2, i32* %b, align 4
86 store i32 3, i32* %c, align 4
87 store i32 4, i32* %d, align 4
88 %0 = load i32* %a, align 4
89 %inc = add nsw i32 %0, 1
90 store i32 %inc, i32* %a, align 4
91 %1 = load i32* %b, align 4
92 %inc1 = add nsw i32 %1, 1
93 store i32 %inc1, i32* %b, align 4
94 %2 = load i32* %c, align 4
95 %inc2 = add nsw i32 %2, 1
96 store i32 %inc2, i32* %c, align 4
97 %3 = load i32* %d, align 4
98 %inc3 = add nsw i32 %3, 1
99 store i32 %inc3, i32* %d, align 4
100 %4 = load i32* %a, align 4
101 %5 = load i32* %b, align 4
102 %add = add nsw i32 %4, %5
103 %6 = load i32* %c, align 4
104 %add4 = add nsw i32 %add, %6
105 %7 = load i32* %d, align 4
106 %add5 = add nsw i32 %add4, %7
111 ; CHECK-V4T: pop {[[SAVED]]}
112 ; CHECK-V4T: pop {r3}
114 ; CHECK-V5T: pop {[[SAVED]], pc}
117 ; CHECK-V4T-LABEL: simplevariadicframe
118 ; CHECK-V5T-LABEL: simplevariadicframe
119 define i32 @simplevariadicframe(i32 %i, ...) #0 {
124 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
127 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
130 %a = alloca i32, align 4
131 %b = alloca i32, align 4
132 %c = alloca i32, align 4
133 %d = alloca i32, align 4
134 store i32 1, i32* %a, align 4
135 store i32 2, i32* %b, align 4
136 store i32 3, i32* %c, align 4
137 store i32 4, i32* %d, align 4
138 %0 = load i32* %a, align 4
139 %inc = add nsw i32 %0, 1
140 store i32 %inc, i32* %a, align 4
141 %1 = load i32* %b, align 4
142 %inc1 = add nsw i32 %1, 1
143 store i32 %inc1, i32* %b, align 4
144 %2 = load i32* %c, align 4
145 %inc2 = add nsw i32 %2, 1
146 store i32 %inc2, i32* %c, align 4
147 %3 = load i32* %d, align 4
148 %inc3 = add nsw i32 %3, 1
149 store i32 %inc3, i32* %d, align 4
150 %4 = load i32* %a, align 4
151 %5 = load i32* %b, align 4
152 %add = add nsw i32 %4, %5
153 %6 = load i32* %c, align 4
154 %add4 = add nsw i32 %add, %6
155 %7 = load i32* %d, align 4
156 %add5 = add nsw i32 %add4, %7
157 %add6 = add nsw i32 %add5, %i
158 call void @llvm.va_start(i8* null)
164 ; CHECK-V4T-NEXT: pop {[[SAVED]]}
165 ; CHECK-V4T-NEXT: pop {r3}
166 ; CHECK-V4T-NEXT: add sp,
167 ; CHECK-V4T-NEXT: bx r3
169 ; CHECK-V5T-NEXT: pop {[[SAVED]]}
170 ; CHECK-V5T-NEXT: pop {r3}
171 ; CHECK-V5T-NEXT: add sp,
172 ; CHECK-V5T-NEXT: bx r3
175 ; CHECK-V4T-LABEL: noframe
176 ; CHECK-V5T-LABEL: noframe
177 define i32 @noframe() #0 {
181 ; CHECK-V4T-NOT: push
182 ; CHECK-V5T-NOT: push
192 ; CHECK-V4T-LABEL: novariadicframe
193 ; CHECK-V5T-LABEL: novariadicframe
194 define i32 @novariadicframe(i32 %i, ...) #0 {
199 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
201 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
203 call void @llvm.va_start(i8* null)
207 ; CHECK-V4T: pop {[[SAVED]]}
208 ; CHECK-V4T-NEXT: pop {r3}
209 ; CHECK-V4T-NEXT: add sp,
210 ; CHECK-V4T-NEXT: bx r3
211 ; CHECK-V5T: pop {[[SAVED]]}
212 ; CHECK-V5T-NEXT: pop {r3}
213 ; CHECK-V5T-NEXT: add sp,
214 ; CHECK-V5T-NEXT: bx r3
217 declare void @llvm.va_start(i8*) nounwind