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
53 ; CHECK-V4T: pop {[[SAVED]]}
54 ; CHECK-V4T-NEXT: mov r12, r3
55 ; CHECK-V4T-NEXT: pop {r3}
56 ; CHECK-V4T-NEXT: add sp,
57 ; CHECK-V4T-NEXT: mov lr, r3
58 ; CHECK-V4T-NEXT: mov r3, r12
61 ; CHECK-V5T-NEXT: pop {[[SAVED]]}
62 ; CHECK-V5T-NEXT: mov r12, r3
63 ; CHECK-V5T-NEXT: pop {r3}
64 ; CHECK-V5T-NEXT: add sp,
65 ; CHECK-V5T-NEXT: mov lr, r3
66 ; CHECK-V5T-NEXT: mov r3, r12
67 ; CHECK-V5T-NEXT: bx lr
70 ; CHECK-V4T-LABEL: simpleframe
71 ; CHECK-V5T-LABEL: simpleframe
72 define i32 @simpleframe() #0 {
76 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
77 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
79 %a = alloca i32, align 4
80 %b = alloca i32, align 4
81 %c = alloca i32, align 4
82 %d = alloca i32, align 4
83 store i32 1, i32* %a, align 4
84 store i32 2, i32* %b, align 4
85 store i32 3, i32* %c, align 4
86 store i32 4, i32* %d, align 4
87 %0 = load i32* %a, align 4
88 %inc = add nsw i32 %0, 1
89 store i32 %inc, i32* %a, align 4
90 %1 = load i32* %b, align 4
91 %inc1 = add nsw i32 %1, 1
92 store i32 %inc1, i32* %b, align 4
93 %2 = load i32* %c, align 4
94 %inc2 = add nsw i32 %2, 1
95 store i32 %inc2, i32* %c, align 4
96 %3 = load i32* %d, align 4
97 %inc3 = add nsw i32 %3, 1
98 store i32 %inc3, i32* %d, align 4
99 %4 = load i32* %a, align 4
100 %5 = load i32* %b, align 4
101 %add = add nsw i32 %4, %5
102 %6 = load i32* %c, align 4
103 %add4 = add nsw i32 %add, %6
104 %7 = load i32* %d, align 4
105 %add5 = add nsw i32 %add4, %7
110 ; CHECK-V4T: pop {[[SAVED]]}
111 ; CHECK-V4T: pop {r3}
113 ; CHECK-V5T: pop {[[SAVED]], pc}
116 ; CHECK-V4T-LABEL: simplevariadicframe
117 ; CHECK-V5T-LABEL: simplevariadicframe
118 define i32 @simplevariadicframe(i32 %i, ...) #0 {
123 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
126 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
129 %a = alloca i32, align 4
130 %b = alloca i32, align 4
131 %c = alloca i32, align 4
132 %d = alloca i32, align 4
133 store i32 1, i32* %a, align 4
134 store i32 2, i32* %b, align 4
135 store i32 3, i32* %c, align 4
136 store i32 4, i32* %d, align 4
137 %0 = load i32* %a, align 4
138 %inc = add nsw i32 %0, 1
139 store i32 %inc, i32* %a, align 4
140 %1 = load i32* %b, align 4
141 %inc1 = add nsw i32 %1, 1
142 store i32 %inc1, i32* %b, align 4
143 %2 = load i32* %c, align 4
144 %inc2 = add nsw i32 %2, 1
145 store i32 %inc2, i32* %c, align 4
146 %3 = load i32* %d, align 4
147 %inc3 = add nsw i32 %3, 1
148 store i32 %inc3, i32* %d, align 4
149 %4 = load i32* %a, align 4
150 %5 = load i32* %b, align 4
151 %add = add nsw i32 %4, %5
152 %6 = load i32* %c, align 4
153 %add4 = add nsw i32 %add, %6
154 %7 = load i32* %d, align 4
155 %add5 = add nsw i32 %add4, %7
156 %add6 = add nsw i32 %add5, %i
162 ; CHECK-V4T-NEXT: pop {[[SAVED]]}
163 ; CHECK-V4T-NEXT: pop {r3}
164 ; CHECK-V4T-NEXT: add sp,
165 ; CHECK-V4T-NEXT: bx r3
167 ; CHECK-V5T-NEXT: pop {[[SAVED]]}
168 ; CHECK-V5T-NEXT: pop {r3}
169 ; CHECK-V5T-NEXT: add sp,
170 ; CHECK-V5T-NEXT: bx r3
173 ; CHECK-V4T-LABEL: noframe
174 ; CHECK-V5T-LABEL: noframe
175 define i32 @noframe() #0 {
179 ; CHECK-V4T-NOT: push
180 ; CHECK-V5T-NOT: push
190 ; CHECK-V4T-LABEL: novariadicframe
191 ; CHECK-V5T-LABEL: novariadicframe
192 define i32 @novariadicframe(i32 %i, ...) #0 {
197 ; CHECK-V4T: push {[[SAVED:(r[4567](, )?)+]], lr}
199 ; CHECK-V5T: push {[[SAVED:(r[4567](, )?)+]], lr}
204 ; CHECK-V4T: pop {[[SAVED]]}
205 ; CHECK-V4T-NEXT: pop {r3}
206 ; CHECK-V4T-NEXT: add sp,
207 ; CHECK-V4T-NEXT: bx r3
208 ; CHECK-V5T: pop {[[SAVED]]}
209 ; CHECK-V5T-NEXT: pop {r3}
210 ; CHECK-V5T-NEXT: add sp,
211 ; CHECK-V5T-NEXT: bx r3