[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / Thumb / frame-chain.ll
blobc92235e0f8279ede52901e4427feb0149066b537
1 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=all --verify-machineinstrs | FileCheck %s --check-prefixes=FP,LEAF-FP
2 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=all -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-FP
3 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=all -mattr=+aapcs-frame-chain-leaf --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-FP-AAPCS
4 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf --verify-machineinstrs | FileCheck %s --check-prefixes=FP,LEAF-NOFP
5 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-NOFP
6 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf -mattr=+aapcs-frame-chain-leaf --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-NOFP-AAPCS
7 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=none --verify-machineinstrs | FileCheck %s --check-prefixes=NOFP,LEAF-NOFP
8 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=none -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=NOFP-AAPCS,LEAF-NOFP
9 ; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=none -mattr=+aapcs-frame-chain-leaf --verify-machineinstrs | FileCheck %s --check-prefixes=NOFP-AAPCS,LEAF-NOFP-AAPCS
11 define dso_local noundef i32 @leaf(i32 noundef %0) {
12 ; LEAF-FP-LABEL: leaf:
13 ; LEAF-FP:       @ %bb.0:
14 ; LEAF-FP-NEXT:    .pad #4
15 ; LEAF-FP-NEXT:    sub sp, #4
16 ; LEAF-FP-NEXT:    str r0, [sp]
17 ; LEAF-FP-NEXT:    adds r0, r0, #4
18 ; LEAF-FP-NEXT:    add sp, #4
19 ; LEAF-FP-NEXT:    bx lr
21 ; LEAF-FP-AAPCS-LABEL: leaf:
22 ; LEAF-FP-AAPCS:       @ %bb.0:
23 ; LEAF-FP-AAPCS-NEXT:    .save {lr}
24 ; LEAF-FP-AAPCS-NEXT:    push {lr}
25 ; LEAF-FP-AAPCS-NEXT:    mov lr, r11
26 ; LEAF-FP-AAPCS-NEXT:    .save {r11}
27 ; LEAF-FP-AAPCS-NEXT:    push {lr}
28 ; LEAF-FP-AAPCS-NEXT:    .setfp r11, sp
29 ; LEAF-FP-AAPCS-NEXT:    mov r11, sp
30 ; LEAF-FP-AAPCS-NEXT:    .pad #4
31 ; LEAF-FP-AAPCS-NEXT:    sub sp, #4
32 ; LEAF-FP-AAPCS-NEXT:    str r0, [sp]
33 ; LEAF-FP-AAPCS-NEXT:    adds r0, r0, #4
34 ; LEAF-FP-AAPCS-NEXT:    add sp, #4
35 ; LEAF-FP-AAPCS-NEXT:    pop {r1}
36 ; LEAF-FP-AAPCS-NEXT:    mov r11, r1
37 ; LEAF-FP-AAPCS-NEXT:    pop {pc}
39 ; LEAF-NOFP-LABEL: leaf:
40 ; LEAF-NOFP:       @ %bb.0:
41 ; LEAF-NOFP-NEXT:    .pad #4
42 ; LEAF-NOFP-NEXT:    sub sp, #4
43 ; LEAF-NOFP-NEXT:    str r0, [sp]
44 ; LEAF-NOFP-NEXT:    adds r0, r0, #4
45 ; LEAF-NOFP-NEXT:    add sp, #4
46 ; LEAF-NOFP-NEXT:    bx lr
48 ; LEAF-NOFP-AAPCS-LABEL: leaf:
49 ; LEAF-NOFP-AAPCS:       @ %bb.0:
50 ; LEAF-NOFP-AAPCS-NEXT:    .pad #4
51 ; LEAF-NOFP-AAPCS-NEXT:    sub sp, #4
52 ; LEAF-NOFP-AAPCS-NEXT:    str r0, [sp]
53 ; LEAF-NOFP-AAPCS-NEXT:    adds r0, r0, #4
54 ; LEAF-NOFP-AAPCS-NEXT:    add sp, #4
55 ; LEAF-NOFP-AAPCS-NEXT:    bx lr
56   %2 = alloca i32, align 4
57   store i32 %0, ptr %2, align 4
58   %3 = load i32, ptr %2, align 4
59   %4 = add nsw i32 %3, 4
60   ret i32 %4
63 define dso_local noundef i32 @non_leaf(i32 noundef %0) {
64 ; FP-LABEL: non_leaf:
65 ; FP:       @ %bb.0:
66 ; FP-NEXT:    .save {r7, lr}
67 ; FP-NEXT:    push {r7, lr}
68 ; FP-NEXT:    .setfp r7, sp
69 ; FP-NEXT:    add r7, sp, #0
70 ; FP-NEXT:    .pad #8
71 ; FP-NEXT:    sub sp, #8
72 ; FP-NEXT:    str r0, [sp, #4]
73 ; FP-NEXT:    bl leaf
74 ; FP-NEXT:    adds r0, r0, #1
75 ; FP-NEXT:    add sp, #8
76 ; FP-NEXT:    pop {r7, pc}
78 ; FP-AAPCS-LABEL: non_leaf:
79 ; FP-AAPCS:       @ %bb.0:
80 ; FP-AAPCS-NEXT:    .save {lr}
81 ; FP-AAPCS-NEXT:    push {lr}
82 ; FP-AAPCS-NEXT:    mov lr, r11
83 ; FP-AAPCS-NEXT:    .save {r11}
84 ; FP-AAPCS-NEXT:    push {lr}
85 ; FP-AAPCS-NEXT:    .setfp r11, sp
86 ; FP-AAPCS-NEXT:    mov r11, sp
87 ; FP-AAPCS-NEXT:    .pad #8
88 ; FP-AAPCS-NEXT:    sub sp, #8
89 ; FP-AAPCS-NEXT:    str r0, [sp, #4]
90 ; FP-AAPCS-NEXT:    bl leaf
91 ; FP-AAPCS-NEXT:    adds r0, r0, #1
92 ; FP-AAPCS-NEXT:    add sp, #8
93 ; FP-AAPCS-NEXT:    pop {r1}
94 ; FP-AAPCS-NEXT:    mov r11, r1
95 ; FP-AAPCS-NEXT:    pop {pc}
97 ; NOFP-LABEL: non_leaf:
98 ; NOFP:       @ %bb.0:
99 ; NOFP-NEXT:    .save {r7, lr}
100 ; NOFP-NEXT:    push {r7, lr}
101 ; NOFP-NEXT:    .pad #8
102 ; NOFP-NEXT:    sub sp, #8
103 ; NOFP-NEXT:    str r0, [sp, #4]
104 ; NOFP-NEXT:    bl leaf
105 ; NOFP-NEXT:    adds r0, r0, #1
106 ; NOFP-NEXT:    add sp, #8
107 ; NOFP-NEXT:    pop {r7, pc}
109 ; NOFP-AAPCS-LABEL: non_leaf:
110 ; NOFP-AAPCS:       @ %bb.0:
111 ; NOFP-AAPCS-NEXT:    .save {r7, lr}
112 ; NOFP-AAPCS-NEXT:    push {r7, lr}
113 ; NOFP-AAPCS-NEXT:    .pad #8
114 ; NOFP-AAPCS-NEXT:    sub sp, #8
115 ; NOFP-AAPCS-NEXT:    str r0, [sp, #4]
116 ; NOFP-AAPCS-NEXT:    bl leaf
117 ; NOFP-AAPCS-NEXT:    adds r0, r0, #1
118 ; NOFP-AAPCS-NEXT:    add sp, #8
119 ; NOFP-AAPCS-NEXT:    pop {r7, pc}
120   %2 = alloca i32, align 4
121   store i32 %0, ptr %2, align 4
122   %3 = load i32, ptr %2, align 4
123   %4 = call noundef i32 @leaf(i32 noundef %3)
124   %5 = add nsw i32 %4, 1
125   ret i32 %5
128 declare ptr @llvm.stacksave()
129 define dso_local void @required_fp(i32 %0, i32 %1) {
130 ; FP-LABEL: required_fp:
131 ; FP:       @ %bb.0:
132 ; FP-NEXT:    .save {r4, r6, r7, lr}
133 ; FP-NEXT:    push {r4, r6, r7, lr}
134 ; FP-NEXT:    .setfp r7, sp, #8
135 ; FP-NEXT:    add r7, sp, #8
136 ; FP-NEXT:    .pad #24
137 ; FP-NEXT:    sub sp, #24
138 ; FP-NEXT:    mov r6, sp
139 ; FP-NEXT:    mov r2, r6
140 ; FP-NEXT:    str r1, [r2, #16]
141 ; FP-NEXT:    str r0, [r2, #20]
142 ; FP-NEXT:    mov r1, sp
143 ; FP-NEXT:    str r1, [r2, #8]
144 ; FP-NEXT:    lsls r1, r0, #2
145 ; FP-NEXT:    adds r1, r1, #7
146 ; FP-NEXT:    movs r3, #7
147 ; FP-NEXT:    bics r1, r3
148 ; FP-NEXT:    mov r3, sp
149 ; FP-NEXT:    subs r1, r3, r1
150 ; FP-NEXT:    mov sp, r1
151 ; FP-NEXT:    movs r1, #0
152 ; FP-NEXT:    str r1, [r6, #4]
153 ; FP-NEXT:    str r0, [r2]
154 ; FP-NEXT:    subs r6, r7, #7
155 ; FP-NEXT:    subs r6, #1
156 ; FP-NEXT:    mov sp, r6
157 ; FP-NEXT:    pop {r4, r6, r7, pc}
159 ; FP-AAPCS-LABEL: required_fp:
160 ; FP-AAPCS:       @ %bb.0:
161 ; FP-AAPCS-NEXT:    .save {lr}
162 ; FP-AAPCS-NEXT:    push {lr}
163 ; FP-AAPCS-NEXT:    mov lr, r11
164 ; FP-AAPCS-NEXT:    .save {r11}
165 ; FP-AAPCS-NEXT:    push {lr}
166 ; FP-AAPCS-NEXT:    .setfp r11, sp
167 ; FP-AAPCS-NEXT:    mov r11, sp
168 ; FP-AAPCS-NEXT:    .save {r4, r6}
169 ; FP-AAPCS-NEXT:    push {r4, r6}
170 ; FP-AAPCS-NEXT:    .pad #24
171 ; FP-AAPCS-NEXT:    sub sp, #24
172 ; FP-AAPCS-NEXT:    mov r6, sp
173 ; FP-AAPCS-NEXT:    mov r2, r6
174 ; FP-AAPCS-NEXT:    str r1, [r2, #16]
175 ; FP-AAPCS-NEXT:    str r0, [r2, #20]
176 ; FP-AAPCS-NEXT:    mov r1, sp
177 ; FP-AAPCS-NEXT:    str r1, [r2, #8]
178 ; FP-AAPCS-NEXT:    lsls r1, r0, #2
179 ; FP-AAPCS-NEXT:    adds r1, r1, #7
180 ; FP-AAPCS-NEXT:    movs r3, #7
181 ; FP-AAPCS-NEXT:    bics r1, r3
182 ; FP-AAPCS-NEXT:    mov r3, sp
183 ; FP-AAPCS-NEXT:    subs r1, r3, r1
184 ; FP-AAPCS-NEXT:    mov sp, r1
185 ; FP-AAPCS-NEXT:    movs r1, #0
186 ; FP-AAPCS-NEXT:    str r1, [r6, #4]
187 ; FP-AAPCS-NEXT:    str r0, [r2]
188 ; FP-AAPCS-NEXT:    mov r6, r11
189 ; FP-AAPCS-NEXT:    subs r6, #8
190 ; FP-AAPCS-NEXT:    mov sp, r6
191 ; FP-AAPCS-NEXT:    pop {r4, r6}
192 ; FP-AAPCS-NEXT:    pop {r0}
193 ; FP-AAPCS-NEXT:    mov r11, r0
194 ; FP-AAPCS-NEXT:    pop {pc}
196 ; NOFP-LABEL: required_fp:
197 ; NOFP:       @ %bb.0:
198 ; NOFP-NEXT:    .save {r4, r6, r7, lr}
199 ; NOFP-NEXT:    push {r4, r6, r7, lr}
200 ; NOFP-NEXT:    .setfp r7, sp, #8
201 ; NOFP-NEXT:    add r7, sp, #8
202 ; NOFP-NEXT:    .pad #24
203 ; NOFP-NEXT:    sub sp, #24
204 ; NOFP-NEXT:    mov r6, sp
205 ; NOFP-NEXT:    mov r2, r6
206 ; NOFP-NEXT:    str r1, [r2, #16]
207 ; NOFP-NEXT:    str r0, [r2, #20]
208 ; NOFP-NEXT:    mov r1, sp
209 ; NOFP-NEXT:    str r1, [r2, #8]
210 ; NOFP-NEXT:    lsls r1, r0, #2
211 ; NOFP-NEXT:    adds r1, r1, #7
212 ; NOFP-NEXT:    movs r3, #7
213 ; NOFP-NEXT:    bics r1, r3
214 ; NOFP-NEXT:    mov r3, sp
215 ; NOFP-NEXT:    subs r1, r3, r1
216 ; NOFP-NEXT:    mov sp, r1
217 ; NOFP-NEXT:    movs r1, #0
218 ; NOFP-NEXT:    str r1, [r6, #4]
219 ; NOFP-NEXT:    str r0, [r2]
220 ; NOFP-NEXT:    subs r6, r7, #7
221 ; NOFP-NEXT:    subs r6, #1
222 ; NOFP-NEXT:    mov sp, r6
223 ; NOFP-NEXT:    pop {r4, r6, r7, pc}
225 ; NOFP-AAPCS-LABEL: required_fp:
226 ; NOFP-AAPCS:       @ %bb.0:
227 ; NOFP-AAPCS-NEXT:    .save {lr}
228 ; NOFP-AAPCS-NEXT:    push {lr}
229 ; NOFP-AAPCS-NEXT:    mov lr, r11
230 ; NOFP-AAPCS-NEXT:    .save {r11}
231 ; NOFP-AAPCS-NEXT:    push {lr}
232 ; NOFP-AAPCS-NEXT:    .setfp r11, sp
233 ; NOFP-AAPCS-NEXT:    mov r11, sp
234 ; NOFP-AAPCS-NEXT:    .save {r4, r6}
235 ; NOFP-AAPCS-NEXT:    push {r4, r6}
236 ; NOFP-AAPCS-NEXT:    .pad #24
237 ; NOFP-AAPCS-NEXT:    sub sp, #24
238 ; NOFP-AAPCS-NEXT:    mov r6, sp
239 ; NOFP-AAPCS-NEXT:    mov r2, r6
240 ; NOFP-AAPCS-NEXT:    str r1, [r2, #16]
241 ; NOFP-AAPCS-NEXT:    str r0, [r2, #20]
242 ; NOFP-AAPCS-NEXT:    mov r1, sp
243 ; NOFP-AAPCS-NEXT:    str r1, [r2, #8]
244 ; NOFP-AAPCS-NEXT:    lsls r1, r0, #2
245 ; NOFP-AAPCS-NEXT:    adds r1, r1, #7
246 ; NOFP-AAPCS-NEXT:    movs r3, #7
247 ; NOFP-AAPCS-NEXT:    bics r1, r3
248 ; NOFP-AAPCS-NEXT:    mov r3, sp
249 ; NOFP-AAPCS-NEXT:    subs r1, r3, r1
250 ; NOFP-AAPCS-NEXT:    mov sp, r1
251 ; NOFP-AAPCS-NEXT:    movs r1, #0
252 ; NOFP-AAPCS-NEXT:    str r1, [r6, #4]
253 ; NOFP-AAPCS-NEXT:    str r0, [r2]
254 ; NOFP-AAPCS-NEXT:    mov r6, r11
255 ; NOFP-AAPCS-NEXT:    subs r6, #8
256 ; NOFP-AAPCS-NEXT:    mov sp, r6
257 ; NOFP-AAPCS-NEXT:    pop {r4, r6}
258 ; NOFP-AAPCS-NEXT:    pop {r0}
259 ; NOFP-AAPCS-NEXT:    mov r11, r0
260 ; NOFP-AAPCS-NEXT:    pop {pc}
261   %3 = alloca i32, align 4
262   %4 = alloca i32, align 4
263   %5 = alloca ptr, align 8
264   %6 = alloca i64, align 8
265   store i32 %0, ptr %3, align 4
266   store i32 %1, ptr %4, align 4
267   %7 = load i32, ptr %3, align 4
268   %8 = zext i32 %7 to i64
269   %9 = call ptr @llvm.stacksave()
270   store ptr %9, ptr %5, align 8
271   %10 = alloca i32, i64 %8, align 4
272   store i64 %8, ptr %6, align 8
273   ret void