| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=none -verify-machineinstrs | FileCheck %s --check-prefix=FP-NONE | |
| ; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=all -verify-machineinstrs | FileCheck %s --check-prefix=FP-ALL | |
| ; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=all -mattr=+aapcs-frame-chain -verify-machineinstrs | FileCheck %s --check-prefix=FP-AAPCS | |
| define void @ra_call() { | |
| ; FP-NONE-LABEL: ra_call: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r7, lr} | |
| ; FP-NONE-NEXT: push {r7, lr} | |
| ; FP-NONE-NEXT: mov r0, lr | |
| ; FP-NONE-NEXT: bl sink_ptr | |
| ; FP-NONE-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-ALL-LABEL: ra_call: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r7, lr} | |
| ; FP-ALL-NEXT: push {r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp | |
| ; FP-ALL-NEXT: add r7, sp, #0 | |
| ; FP-ALL-NEXT: mov r0, lr | |
| ; FP-ALL-NEXT: bl sink_ptr | |
| ; FP-ALL-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: ra_call: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: mov r0, lr | |
| ; FP-AAPCS-NEXT: bl sink_ptr | |
| ; FP-AAPCS-NEXT: pop {r0} | |
| ; FP-AAPCS-NEXT: mov r11, r0 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| tail call void @sink_ptr(ptr %r) | |
| ret void | |
| } | |
| define ptr @ra_return() { | |
| ; FP-NONE-LABEL: ra_return: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: mov r0, lr | |
| ; FP-NONE-NEXT: bx lr | |
| ; | |
| ; FP-ALL-LABEL: ra_return: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r7, lr} | |
| ; FP-ALL-NEXT: push {r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp | |
| ; FP-ALL-NEXT: add r7, sp, #0 | |
| ; FP-ALL-NEXT: mov r0, lr | |
| ; FP-ALL-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: ra_return: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: mov r0, lr | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| ret ptr %r | |
| } | |
| define ptr @callee_saved_low() { | |
| ; FP-NONE-LABEL: callee_saved_low: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r4, r5, r7, lr} | |
| ; FP-NONE-NEXT: push {r4, r5, r7, lr} | |
| ; FP-NONE-NEXT: mov r0, lr | |
| ; FP-NONE-NEXT: @APP | |
| ; FP-NONE-NEXT: @NO_APP | |
| ; FP-NONE-NEXT: pop {r4, r5, r7, pc} | |
| ; | |
| ; FP-ALL-LABEL: callee_saved_low: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r4, r5, r7, lr} | |
| ; FP-ALL-NEXT: push {r4, r5, r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp, #8 | |
| ; FP-ALL-NEXT: add r7, sp, #8 | |
| ; FP-ALL-NEXT: mov r0, lr | |
| ; FP-ALL-NEXT: @APP | |
| ; FP-ALL-NEXT: @NO_APP | |
| ; FP-ALL-NEXT: pop {r4, r5, r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: callee_saved_low: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: .save {r4, r5} | |
| ; FP-AAPCS-NEXT: push {r4, r5} | |
| ; FP-AAPCS-NEXT: mov r0, lr | |
| ; FP-AAPCS-NEXT: @APP | |
| ; FP-AAPCS-NEXT: @NO_APP | |
| ; FP-AAPCS-NEXT: pop {r4, r5} | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| call void asm sideeffect "", "~{r4},~{r5}"() | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| ret ptr %r | |
| } | |
| define ptr @callee_saved_high() { | |
| ; FP-NONE-LABEL: callee_saved_high: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: mov r3, r9 | |
| ; FP-NONE-NEXT: mov r2, r8 | |
| ; FP-NONE-NEXT: .save {r8, r9} | |
| ; FP-NONE-NEXT: push {r2, r3} | |
| ; FP-NONE-NEXT: mov r0, lr | |
| ; FP-NONE-NEXT: @APP | |
| ; FP-NONE-NEXT: @NO_APP | |
| ; FP-NONE-NEXT: pop {r1, r2} | |
| ; FP-NONE-NEXT: mov r8, r1 | |
| ; FP-NONE-NEXT: mov r9, r2 | |
| ; FP-NONE-NEXT: bx lr | |
| ; | |
| ; FP-ALL-LABEL: callee_saved_high: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r7, lr} | |
| ; FP-ALL-NEXT: push {r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp | |
| ; FP-ALL-NEXT: add r7, sp, #0 | |
| ; FP-ALL-NEXT: mov r3, r9 | |
| ; FP-ALL-NEXT: mov r2, r8 | |
| ; FP-ALL-NEXT: .save {r8, r9} | |
| ; FP-ALL-NEXT: push {r2, r3} | |
| ; FP-ALL-NEXT: mov r0, lr | |
| ; FP-ALL-NEXT: @APP | |
| ; FP-ALL-NEXT: @NO_APP | |
| ; FP-ALL-NEXT: pop {r1, r2} | |
| ; FP-ALL-NEXT: mov r8, r1 | |
| ; FP-ALL-NEXT: mov r9, r2 | |
| ; FP-ALL-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: callee_saved_high: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: mov r3, r9 | |
| ; FP-AAPCS-NEXT: mov r2, r8 | |
| ; FP-AAPCS-NEXT: .save {r8, r9} | |
| ; FP-AAPCS-NEXT: push {r2, r3} | |
| ; FP-AAPCS-NEXT: mov r0, lr | |
| ; FP-AAPCS-NEXT: @APP | |
| ; FP-AAPCS-NEXT: @NO_APP | |
| ; FP-AAPCS-NEXT: pop {r1, r2} | |
| ; FP-AAPCS-NEXT: mov r8, r1 | |
| ; FP-AAPCS-NEXT: mov r9, r2 | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| call void asm sideeffect "", "~{r8},~{r9}"() | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| ret ptr %r | |
| } | |
| define ptr @large_alloca() { | |
| ; FP-NONE-LABEL: large_alloca: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r4, r5, r6, lr} | |
| ; FP-NONE-NEXT: push {r4, r5, r6, lr} | |
| ; FP-NONE-NEXT: ldr r6, .LCPI4_0 | |
| ; FP-NONE-NEXT: .pad #2000 | |
| ; FP-NONE-NEXT: add sp, r6 | |
| ; FP-NONE-NEXT: mov r4, lr | |
| ; FP-NONE-NEXT: mov r0, sp | |
| ; FP-NONE-NEXT: bl sink_ptr | |
| ; FP-NONE-NEXT: mov r0, r4 | |
| ; FP-NONE-NEXT: ldr r6, .LCPI4_1 | |
| ; FP-NONE-NEXT: add sp, r6 | |
| ; FP-NONE-NEXT: pop {r4, r5, r6, pc} | |
| ; FP-NONE-NEXT: .p2align 2 | |
| ; FP-NONE-NEXT: @ %bb.1: | |
| ; FP-NONE-NEXT: .LCPI4_0: | |
| ; FP-NONE-NEXT: .long 4294965296 @ 0xfffff830 | |
| ; FP-NONE-NEXT: .LCPI4_1: | |
| ; FP-NONE-NEXT: .long 2000 @ 0x7d0 | |
| ; | |
| ; FP-ALL-LABEL: large_alloca: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: push {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp, #8 | |
| ; FP-ALL-NEXT: add r7, sp, #8 | |
| ; FP-ALL-NEXT: ldr r6, .LCPI4_0 | |
| ; FP-ALL-NEXT: .pad #2000 | |
| ; FP-ALL-NEXT: add sp, r6 | |
| ; FP-ALL-NEXT: mov r4, lr | |
| ; FP-ALL-NEXT: mov r0, sp | |
| ; FP-ALL-NEXT: bl sink_ptr | |
| ; FP-ALL-NEXT: mov r0, r4 | |
| ; FP-ALL-NEXT: subs r6, r7, #7 | |
| ; FP-ALL-NEXT: subs r6, #1 | |
| ; FP-ALL-NEXT: mov sp, r6 | |
| ; FP-ALL-NEXT: pop {r4, r6, r7, pc} | |
| ; FP-ALL-NEXT: .p2align 2 | |
| ; FP-ALL-NEXT: @ %bb.1: | |
| ; FP-ALL-NEXT: .LCPI4_0: | |
| ; FP-ALL-NEXT: .long 4294965296 @ 0xfffff830 | |
| ; | |
| ; FP-AAPCS-LABEL: large_alloca: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: .save {r4, r7} | |
| ; FP-AAPCS-NEXT: push {r4, r7} | |
| ; FP-AAPCS-NEXT: ldr r7, .LCPI4_0 | |
| ; FP-AAPCS-NEXT: .pad #2000 | |
| ; FP-AAPCS-NEXT: add sp, r7 | |
| ; FP-AAPCS-NEXT: mov r4, lr | |
| ; FP-AAPCS-NEXT: mov r0, sp | |
| ; FP-AAPCS-NEXT: bl sink_ptr | |
| ; FP-AAPCS-NEXT: mov r0, r4 | |
| ; FP-AAPCS-NEXT: mov r7, r11 | |
| ; FP-AAPCS-NEXT: subs r7, #8 | |
| ; FP-AAPCS-NEXT: mov sp, r7 | |
| ; FP-AAPCS-NEXT: pop {r4, r7} | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| ; FP-AAPCS-NEXT: .p2align 2 | |
| ; FP-AAPCS-NEXT: @ %bb.1: | |
| ; FP-AAPCS-NEXT: .LCPI4_0: | |
| ; FP-AAPCS-NEXT: .long 4294965296 @ 0xfffff830 | |
| entry: | |
| %big = alloca i8, i32 2000 | |
| tail call void @sink_ptr(ptr %big) | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| ret ptr %r | |
| } | |
| define ptr @var_alloca(i32 %size) { | |
| ; FP-NONE-LABEL: var_alloca: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r4, r6, r7, lr} | |
| ; FP-NONE-NEXT: push {r4, r6, r7, lr} | |
| ; FP-NONE-NEXT: .setfp r7, sp, #8 | |
| ; FP-NONE-NEXT: add r7, sp, #8 | |
| ; FP-NONE-NEXT: mov r6, sp | |
| ; FP-NONE-NEXT: mov r4, lr | |
| ; FP-NONE-NEXT: adds r0, r0, #7 | |
| ; FP-NONE-NEXT: movs r1, #7 | |
| ; FP-NONE-NEXT: bics r0, r1 | |
| ; FP-NONE-NEXT: mov r1, sp | |
| ; FP-NONE-NEXT: subs r0, r1, r0 | |
| ; FP-NONE-NEXT: mov sp, r0 | |
| ; FP-NONE-NEXT: bl sink_ptr | |
| ; FP-NONE-NEXT: mov r0, r4 | |
| ; FP-NONE-NEXT: subs r6, r7, #7 | |
| ; FP-NONE-NEXT: subs r6, #1 | |
| ; FP-NONE-NEXT: mov sp, r6 | |
| ; FP-NONE-NEXT: pop {r4, r6, r7, pc} | |
| ; | |
| ; FP-ALL-LABEL: var_alloca: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: push {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp, #8 | |
| ; FP-ALL-NEXT: add r7, sp, #8 | |
| ; FP-ALL-NEXT: mov r6, sp | |
| ; FP-ALL-NEXT: mov r4, lr | |
| ; FP-ALL-NEXT: adds r0, r0, #7 | |
| ; FP-ALL-NEXT: movs r1, #7 | |
| ; FP-ALL-NEXT: bics r0, r1 | |
| ; FP-ALL-NEXT: mov r1, sp | |
| ; FP-ALL-NEXT: subs r0, r1, r0 | |
| ; FP-ALL-NEXT: mov sp, r0 | |
| ; FP-ALL-NEXT: bl sink_ptr | |
| ; FP-ALL-NEXT: mov r0, r4 | |
| ; FP-ALL-NEXT: subs r6, r7, #7 | |
| ; FP-ALL-NEXT: subs r6, #1 | |
| ; FP-ALL-NEXT: mov sp, r6 | |
| ; FP-ALL-NEXT: pop {r4, r6, r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: var_alloca: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: .save {r4, r6} | |
| ; FP-AAPCS-NEXT: push {r4, r6} | |
| ; FP-AAPCS-NEXT: mov r6, sp | |
| ; FP-AAPCS-NEXT: mov r4, lr | |
| ; FP-AAPCS-NEXT: adds r0, r0, #7 | |
| ; FP-AAPCS-NEXT: movs r1, #7 | |
| ; FP-AAPCS-NEXT: bics r0, r1 | |
| ; FP-AAPCS-NEXT: mov r1, sp | |
| ; FP-AAPCS-NEXT: subs r0, r1, r0 | |
| ; FP-AAPCS-NEXT: mov sp, r0 | |
| ; FP-AAPCS-NEXT: bl sink_ptr | |
| ; FP-AAPCS-NEXT: mov r0, r4 | |
| ; FP-AAPCS-NEXT: mov r6, r11 | |
| ; FP-AAPCS-NEXT: subs r6, #8 | |
| ; FP-AAPCS-NEXT: mov sp, r6 | |
| ; FP-AAPCS-NEXT: pop {r4, r6} | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| %var = alloca i8, i32 %size | |
| tail call void @sink_ptr(ptr %var) | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| ret ptr %r | |
| } | |
| define i32 @all_arg_regs(i32 %a, i32 %b, i32 %c, i32 %d) { | |
| ; FP-NONE-LABEL: all_arg_regs: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r4, lr} | |
| ; FP-NONE-NEXT: push {r4, lr} | |
| ; FP-NONE-NEXT: mov r4, lr | |
| ; FP-NONE-NEXT: adds r0, r0, r1 | |
| ; FP-NONE-NEXT: adds r0, r0, r2 | |
| ; FP-NONE-NEXT: adds r0, r0, r3 | |
| ; FP-NONE-NEXT: adds r0, r0, r4 | |
| ; FP-NONE-NEXT: pop {r4, pc} | |
| ; | |
| ; FP-ALL-LABEL: all_arg_regs: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: push {r4, r6, r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp, #8 | |
| ; FP-ALL-NEXT: add r7, sp, #8 | |
| ; FP-ALL-NEXT: mov r4, lr | |
| ; FP-ALL-NEXT: adds r0, r0, r1 | |
| ; FP-ALL-NEXT: adds r0, r0, r2 | |
| ; FP-ALL-NEXT: adds r0, r0, r3 | |
| ; FP-ALL-NEXT: adds r0, r0, r4 | |
| ; FP-ALL-NEXT: pop {r4, r6, r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: all_arg_regs: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov lr, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: .save {r4, r7} | |
| ; FP-AAPCS-NEXT: push {r4, r7} | |
| ; FP-AAPCS-NEXT: ldr r7, [sp, #12] | |
| ; FP-AAPCS-NEXT: mov lr, r7 | |
| ; FP-AAPCS-NEXT: mov r4, lr | |
| ; FP-AAPCS-NEXT: adds r0, r0, r1 | |
| ; FP-AAPCS-NEXT: adds r0, r0, r2 | |
| ; FP-AAPCS-NEXT: adds r0, r0, r3 | |
| ; FP-AAPCS-NEXT: adds r0, r0, r4 | |
| ; FP-AAPCS-NEXT: pop {r4, r7} | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| %r = tail call ptr @llvm.returnaddress(i32 0) | |
| %ri = ptrtoint ptr %r to i32 | |
| %t1 = add i32 %a, %b | |
| %t2 = add i32 %t1, %c | |
| %t3 = add i32 %t2, %d | |
| %t4 = add i32 %t3, %ri | |
| ret i32 %t4 | |
| } | |
| define ptr @ra_depth_1() { | |
| ; FP-NONE-LABEL: ra_depth_1: | |
| ; FP-NONE: @ %bb.0: @ %entry | |
| ; FP-NONE-NEXT: .save {r7, lr} | |
| ; FP-NONE-NEXT: push {r7, lr} | |
| ; FP-NONE-NEXT: .setfp r7, sp | |
| ; FP-NONE-NEXT: add r7, sp, #0 | |
| ; FP-NONE-NEXT: ldr r0, [r7] | |
| ; FP-NONE-NEXT: ldr r0, [r0, #4] | |
| ; FP-NONE-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-ALL-LABEL: ra_depth_1: | |
| ; FP-ALL: @ %bb.0: @ %entry | |
| ; FP-ALL-NEXT: .save {r7, lr} | |
| ; FP-ALL-NEXT: push {r7, lr} | |
| ; FP-ALL-NEXT: .setfp r7, sp | |
| ; FP-ALL-NEXT: add r7, sp, #0 | |
| ; FP-ALL-NEXT: ldr r0, [r7] | |
| ; FP-ALL-NEXT: ldr r0, [r0, #4] | |
| ; FP-ALL-NEXT: pop {r7, pc} | |
| ; | |
| ; FP-AAPCS-LABEL: ra_depth_1: | |
| ; FP-AAPCS: @ %bb.0: @ %entry | |
| ; FP-AAPCS-NEXT: .save {lr} | |
| ; FP-AAPCS-NEXT: push {lr} | |
| ; FP-AAPCS-NEXT: mov r3, r11 | |
| ; FP-AAPCS-NEXT: .save {r11} | |
| ; FP-AAPCS-NEXT: push {r3} | |
| ; FP-AAPCS-NEXT: .setfp r11, sp | |
| ; FP-AAPCS-NEXT: mov r11, sp | |
| ; FP-AAPCS-NEXT: mov r0, r11 | |
| ; FP-AAPCS-NEXT: ldr r0, [r0] | |
| ; FP-AAPCS-NEXT: ldr r0, [r0, #4] | |
| ; FP-AAPCS-NEXT: pop {r1} | |
| ; FP-AAPCS-NEXT: mov r11, r1 | |
| ; FP-AAPCS-NEXT: pop {pc} | |
| entry: | |
| %r = tail call ptr @llvm.returnaddress(i32 1) | |
| ret ptr %r | |
| } | |
| declare void @sink_ptr(ptr) |