blob: 7e9258002f61598f0ee5cc50da6527ebd44fef15 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none | FileCheck %s --check-prefix=R7
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved | FileCheck %s --check-prefix=R7-RES
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all | FileCheck %s --check-prefix=R7-ABI
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-RES
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-ABI
; int test1() {
; return 0;
; }
define i32 @test1() "sign-return-address"="non-leaf" {
; R7-LABEL: test1:
; R7: .cfi_sections .debug_frame
; R7-NEXT: .cfi_startproc
; R7-NEXT: @ %bb.0: @ %entry
; R7-NEXT: movs r0, #0
; R7-NEXT: bx lr
;
; R7-RES-LABEL: test1:
; R7-RES: .cfi_sections .debug_frame
; R7-RES-NEXT: .cfi_startproc
; R7-RES-NEXT: @ %bb.0: @ %entry
; R7-RES-NEXT: movs r0, #0
; R7-RES-NEXT: bx lr
;
; R7-ABI-LABEL: test1:
; R7-ABI: .cfi_sections .debug_frame
; R7-ABI-NEXT: .cfi_startproc
; R7-ABI-NEXT: @ %bb.0: @ %entry
; R7-ABI-NEXT: pac r12, lr, sp
; R7-ABI-NEXT: .save {r7, lr}
; R7-ABI-NEXT: push {r7, lr}
; R7-ABI-NEXT: .cfi_def_cfa_offset 8
; R7-ABI-NEXT: .cfi_offset lr, -4
; R7-ABI-NEXT: .cfi_offset r7, -8
; R7-ABI-NEXT: .setfp r7, sp
; R7-ABI-NEXT: mov r7, sp
; R7-ABI-NEXT: .cfi_def_cfa_register r7
; R7-ABI-NEXT: .save {ra_auth_code}
; R7-ABI-NEXT: str r12, [sp, #-4]!
; R7-ABI-NEXT: .cfi_offset ra_auth_code, -12
; R7-ABI-NEXT: movs r0, #0
; R7-ABI-NEXT: ldr r12, [sp], #4
; R7-ABI-NEXT: pop.w {r7, lr}
; R7-ABI-NEXT: aut r12, lr, sp
; R7-ABI-NEXT: bx lr
;
; R11-LABEL: test1:
; R11: .cfi_sections .debug_frame
; R11-NEXT: .cfi_startproc
; R11-NEXT: @ %bb.0: @ %entry
; R11-NEXT: movs r0, #0
; R11-NEXT: bx lr
;
; R11-RES-LABEL: test1:
; R11-RES: .cfi_sections .debug_frame
; R11-RES-NEXT: .cfi_startproc
; R11-RES-NEXT: @ %bb.0: @ %entry
; R11-RES-NEXT: movs r0, #0
; R11-RES-NEXT: bx lr
;
; R11-ABI-LABEL: test1:
; R11-ABI: .cfi_sections .debug_frame
; R11-ABI-NEXT: .cfi_startproc
; R11-ABI-NEXT: @ %bb.0: @ %entry
; R11-ABI-NEXT: pac r12, lr, sp
; R11-ABI-NEXT: .save {ra_auth_code}
; R11-ABI-NEXT: str r12, [sp, #-4]!
; R11-ABI-NEXT: .cfi_def_cfa_offset 4
; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4
; R11-ABI-NEXT: .save {r11, lr}
; R11-ABI-NEXT: push.w {r11, lr}
; R11-ABI-NEXT: .cfi_def_cfa_offset 12
; R11-ABI-NEXT: .cfi_offset lr, -8
; R11-ABI-NEXT: .cfi_offset r11, -12
; R11-ABI-NEXT: .setfp r11, sp
; R11-ABI-NEXT: mov r11, sp
; R11-ABI-NEXT: .cfi_def_cfa_register r11
; R11-ABI-NEXT: movs r0, #0
; R11-ABI-NEXT: pop.w {r11, lr}
; R11-ABI-NEXT: ldr r12, [sp], #4
; R11-ABI-NEXT: aut r12, lr, sp
; R11-ABI-NEXT: bx lr
entry:
ret i32 0
}
; void foo(int n) {
; int a[n];
; bar(a);
; }
define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" {
; R7-LABEL: test2:
; R7: .cfi_startproc
; R7-NEXT: @ %bb.0: @ %entry
; R7-NEXT: pac r12, lr, sp
; R7-NEXT: .save {r4, r6, r7, ra_auth_code, lr}
; R7-NEXT: push.w {r4, r6, r7, r12, lr}
; R7-NEXT: .cfi_def_cfa_offset 20
; R7-NEXT: .cfi_offset lr, -4
; R7-NEXT: .cfi_offset ra_auth_code, -8
; R7-NEXT: .cfi_offset r7, -12
; R7-NEXT: .cfi_offset r6, -16
; R7-NEXT: .cfi_offset r4, -20
; R7-NEXT: .setfp r7, sp, #8
; R7-NEXT: add r7, sp, #8
; R7-NEXT: .cfi_def_cfa r7, 12
; R7-NEXT: .pad #4
; R7-NEXT: sub sp, #4
; R7-NEXT: movs r1, #7
; R7-NEXT: add.w r0, r1, r0, lsl #2
; R7-NEXT: bic r0, r0, #7
; R7-NEXT: sub.w r0, sp, r0
; R7-NEXT: mov sp, r0
; R7-NEXT: bl take_ptr
; R7-NEXT: sub.w r4, r7, #8
; R7-NEXT: mov sp, r4
; R7-NEXT: pop.w {r4, r6, r7, r12, lr}
; R7-NEXT: aut r12, lr, sp
; R7-NEXT: bx lr
;
; R7-RES-LABEL: test2:
; R7-RES: .cfi_startproc
; R7-RES-NEXT: @ %bb.0: @ %entry
; R7-RES-NEXT: pac r12, lr, sp
; R7-RES-NEXT: .save {r4, r6, r7, lr}
; R7-RES-NEXT: push {r4, r6, r7, lr}
; R7-RES-NEXT: .cfi_def_cfa_offset 16
; R7-RES-NEXT: .cfi_offset lr, -4
; R7-RES-NEXT: .cfi_offset r7, -8
; R7-RES-NEXT: .cfi_offset r6, -12
; R7-RES-NEXT: .cfi_offset r4, -16
; R7-RES-NEXT: .setfp r7, sp, #8
; R7-RES-NEXT: add r7, sp, #8
; R7-RES-NEXT: .cfi_def_cfa r7, 8
; R7-RES-NEXT: .save {ra_auth_code}
; R7-RES-NEXT: str r12, [sp, #-4]!
; R7-RES-NEXT: .cfi_offset ra_auth_code, -20
; R7-RES-NEXT: .pad #4
; R7-RES-NEXT: sub sp, #4
; R7-RES-NEXT: movs r1, #7
; R7-RES-NEXT: add.w r0, r1, r0, lsl #2
; R7-RES-NEXT: bic r0, r0, #7
; R7-RES-NEXT: sub.w r0, sp, r0
; R7-RES-NEXT: mov sp, r0
; R7-RES-NEXT: bl take_ptr
; R7-RES-NEXT: sub.w r4, r7, #12
; R7-RES-NEXT: mov sp, r4
; R7-RES-NEXT: ldr r12, [sp], #4
; R7-RES-NEXT: pop.w {r4, r6, r7, lr}
; R7-RES-NEXT: aut r12, lr, sp
; R7-RES-NEXT: bx lr
;
; R7-ABI-LABEL: test2:
; R7-ABI: .cfi_startproc
; R7-ABI-NEXT: @ %bb.0: @ %entry
; R7-ABI-NEXT: pac r12, lr, sp
; R7-ABI-NEXT: .save {r4, r6, r7, lr}
; R7-ABI-NEXT: push {r4, r6, r7, lr}
; R7-ABI-NEXT: .cfi_def_cfa_offset 16
; R7-ABI-NEXT: .cfi_offset lr, -4
; R7-ABI-NEXT: .cfi_offset r7, -8
; R7-ABI-NEXT: .cfi_offset r6, -12
; R7-ABI-NEXT: .cfi_offset r4, -16
; R7-ABI-NEXT: .setfp r7, sp, #8
; R7-ABI-NEXT: add r7, sp, #8
; R7-ABI-NEXT: .cfi_def_cfa r7, 8
; R7-ABI-NEXT: .save {ra_auth_code}
; R7-ABI-NEXT: str r12, [sp, #-4]!
; R7-ABI-NEXT: .cfi_offset ra_auth_code, -20
; R7-ABI-NEXT: .pad #4
; R7-ABI-NEXT: sub sp, #4
; R7-ABI-NEXT: movs r1, #7
; R7-ABI-NEXT: add.w r0, r1, r0, lsl #2
; R7-ABI-NEXT: bic r0, r0, #7
; R7-ABI-NEXT: sub.w r0, sp, r0
; R7-ABI-NEXT: mov sp, r0
; R7-ABI-NEXT: bl take_ptr
; R7-ABI-NEXT: sub.w r4, r7, #12
; R7-ABI-NEXT: mov sp, r4
; R7-ABI-NEXT: ldr r12, [sp], #4
; R7-ABI-NEXT: pop.w {r4, r6, r7, lr}
; R7-ABI-NEXT: aut r12, lr, sp
; R7-ABI-NEXT: bx lr
;
; R11-LABEL: test2:
; R11: .cfi_startproc
; R11-NEXT: @ %bb.0: @ %entry
; R11-NEXT: pac r12, lr, sp
; R11-NEXT: .save {r4, r7, r11, ra_auth_code, lr}
; R11-NEXT: push.w {r4, r7, r11, r12, lr}
; R11-NEXT: .cfi_def_cfa_offset 20
; R11-NEXT: .cfi_offset lr, -4
; R11-NEXT: .cfi_offset ra_auth_code, -8
; R11-NEXT: .cfi_offset r11, -12
; R11-NEXT: .cfi_offset r7, -16
; R11-NEXT: .cfi_offset r4, -20
; R11-NEXT: .setfp r11, sp, #8
; R11-NEXT: add.w r11, sp, #8
; R11-NEXT: .cfi_def_cfa r11, 12
; R11-NEXT: .pad #4
; R11-NEXT: sub sp, #4
; R11-NEXT: movs r1, #7
; R11-NEXT: add.w r0, r1, r0, lsl #2
; R11-NEXT: bic r0, r0, #7
; R11-NEXT: sub.w r0, sp, r0
; R11-NEXT: mov sp, r0
; R11-NEXT: bl take_ptr
; R11-NEXT: sub.w r4, r11, #8
; R11-NEXT: mov sp, r4
; R11-NEXT: pop.w {r4, r7, r11, r12, lr}
; R11-NEXT: aut r12, lr, sp
; R11-NEXT: bx lr
;
; R11-RES-LABEL: test2:
; R11-RES: .cfi_startproc
; R11-RES-NEXT: @ %bb.0: @ %entry
; R11-RES-NEXT: pac r12, lr, sp
; R11-RES-NEXT: .save {r4, r7, ra_auth_code}
; R11-RES-NEXT: push.w {r4, r7, r12}
; R11-RES-NEXT: .cfi_def_cfa_offset 12
; R11-RES-NEXT: .cfi_offset ra_auth_code, -4
; R11-RES-NEXT: .cfi_offset r7, -8
; R11-RES-NEXT: .cfi_offset r4, -12
; R11-RES-NEXT: .save {r11, lr}
; R11-RES-NEXT: push.w {r11, lr}
; R11-RES-NEXT: .cfi_def_cfa_offset 20
; R11-RES-NEXT: .cfi_offset lr, -16
; R11-RES-NEXT: .cfi_offset r11, -20
; R11-RES-NEXT: .setfp r11, sp
; R11-RES-NEXT: mov r11, sp
; R11-RES-NEXT: .cfi_def_cfa_register r11
; R11-RES-NEXT: .pad #4
; R11-RES-NEXT: sub sp, #4
; R11-RES-NEXT: movs r1, #7
; R11-RES-NEXT: add.w r0, r1, r0, lsl #2
; R11-RES-NEXT: bic r0, r0, #7
; R11-RES-NEXT: sub.w r0, sp, r0
; R11-RES-NEXT: mov sp, r0
; R11-RES-NEXT: bl take_ptr
; R11-RES-NEXT: mov sp, r11
; R11-RES-NEXT: pop.w {r11, lr}
; R11-RES-NEXT: pop.w {r4, r7, r12}
; R11-RES-NEXT: aut r12, lr, sp
; R11-RES-NEXT: bx lr
;
; R11-ABI-LABEL: test2:
; R11-ABI: .cfi_startproc
; R11-ABI-NEXT: @ %bb.0: @ %entry
; R11-ABI-NEXT: pac r12, lr, sp
; R11-ABI-NEXT: .save {r4, r7, ra_auth_code}
; R11-ABI-NEXT: push.w {r4, r7, r12}
; R11-ABI-NEXT: .cfi_def_cfa_offset 12
; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4
; R11-ABI-NEXT: .cfi_offset r7, -8
; R11-ABI-NEXT: .cfi_offset r4, -12
; R11-ABI-NEXT: .save {r11, lr}
; R11-ABI-NEXT: push.w {r11, lr}
; R11-ABI-NEXT: .cfi_def_cfa_offset 20
; R11-ABI-NEXT: .cfi_offset lr, -16
; R11-ABI-NEXT: .cfi_offset r11, -20
; R11-ABI-NEXT: .setfp r11, sp
; R11-ABI-NEXT: mov r11, sp
; R11-ABI-NEXT: .cfi_def_cfa_register r11
; R11-ABI-NEXT: .pad #4
; R11-ABI-NEXT: sub sp, #4
; R11-ABI-NEXT: movs r1, #7
; R11-ABI-NEXT: add.w r0, r1, r0, lsl #2
; R11-ABI-NEXT: bic r0, r0, #7
; R11-ABI-NEXT: sub.w r0, sp, r0
; R11-ABI-NEXT: mov sp, r0
; R11-ABI-NEXT: bl take_ptr
; R11-ABI-NEXT: mov sp, r11
; R11-ABI-NEXT: pop.w {r11, lr}
; R11-ABI-NEXT: pop.w {r4, r7, r12}
; R11-ABI-NEXT: aut r12, lr, sp
; R11-ABI-NEXT: bx lr
entry:
%vla = alloca i32, i32 %n, align 4
call void @take_ptr(ptr noundef nonnull %vla)
ret void
}
; void test3(int c, float e, int z) {
; if (c)
; knr();
; take_ptr(alloca(z));
; if (e)
; knr();
; }
define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-return-address"="non-leaf" {
; R7-LABEL: test3:
; R7: .cfi_startproc
; R7-NEXT: @ %bb.0: @ %entry
; R7-NEXT: pac r12, lr, sp
; R7-NEXT: .save {r4, r5, r6, r7, r8, ra_auth_code, lr}
; R7-NEXT: push.w {r4, r5, r6, r7, r8, r12, lr}
; R7-NEXT: .cfi_def_cfa_offset 28
; R7-NEXT: .cfi_offset lr, -4
; R7-NEXT: .cfi_offset ra_auth_code, -8
; R7-NEXT: .cfi_offset r8, -12
; R7-NEXT: .cfi_offset r7, -16
; R7-NEXT: .cfi_offset r6, -20
; R7-NEXT: .cfi_offset r5, -24
; R7-NEXT: .cfi_offset r4, -28
; R7-NEXT: .setfp r7, sp, #12
; R7-NEXT: add r7, sp, #12
; R7-NEXT: .cfi_def_cfa r7, 16
; R7-NEXT: .pad #4
; R7-NEXT: sub sp, #4
; R7-NEXT: cmp r0, #0
; R7-NEXT: mov r5, r2
; R7-NEXT: mov r4, r1
; R7-NEXT: it ne
; R7-NEXT: blne knr
; R7-NEXT: adds r0, r5, #7
; R7-NEXT: bic r0, r0, #7
; R7-NEXT: sub.w r0, sp, r0
; R7-NEXT: mov sp, r0
; R7-NEXT: bl take_ptr
; R7-NEXT: mov r0, r4
; R7-NEXT: movs r1, #0
; R7-NEXT: bl __aeabi_fcmpeq
; R7-NEXT: cmp r0, #0
; R7-NEXT: it eq
; R7-NEXT: bleq knr
; R7-NEXT: sub.w r4, r7, #12
; R7-NEXT: mov sp, r4
; R7-NEXT: pop.w {r4, r5, r6, r7, r8, r12, lr}
; R7-NEXT: aut r12, lr, sp
; R7-NEXT: bx lr
;
; R7-RES-LABEL: test3:
; R7-RES: .cfi_startproc
; R7-RES-NEXT: @ %bb.0: @ %entry
; R7-RES-NEXT: pac r12, lr, sp
; R7-RES-NEXT: .save {r4, r5, r6, r7, lr}
; R7-RES-NEXT: push {r4, r5, r6, r7, lr}
; R7-RES-NEXT: .cfi_def_cfa_offset 20
; R7-RES-NEXT: .cfi_offset lr, -4
; R7-RES-NEXT: .cfi_offset r7, -8
; R7-RES-NEXT: .cfi_offset r6, -12
; R7-RES-NEXT: .cfi_offset r5, -16
; R7-RES-NEXT: .cfi_offset r4, -20
; R7-RES-NEXT: .setfp r7, sp, #12
; R7-RES-NEXT: add r7, sp, #12
; R7-RES-NEXT: .cfi_def_cfa r7, 8
; R7-RES-NEXT: .save {r8, ra_auth_code}
; R7-RES-NEXT: push.w {r8, r12}
; R7-RES-NEXT: .cfi_offset ra_auth_code, -24
; R7-RES-NEXT: .cfi_offset r8, -28
; R7-RES-NEXT: .pad #4
; R7-RES-NEXT: sub sp, #4
; R7-RES-NEXT: cmp r0, #0
; R7-RES-NEXT: mov r5, r2
; R7-RES-NEXT: mov r4, r1
; R7-RES-NEXT: it ne
; R7-RES-NEXT: blne knr
; R7-RES-NEXT: adds r0, r5, #7
; R7-RES-NEXT: bic r0, r0, #7
; R7-RES-NEXT: sub.w r0, sp, r0
; R7-RES-NEXT: mov sp, r0
; R7-RES-NEXT: bl take_ptr
; R7-RES-NEXT: mov r0, r4
; R7-RES-NEXT: movs r1, #0
; R7-RES-NEXT: bl __aeabi_fcmpeq
; R7-RES-NEXT: cmp r0, #0
; R7-RES-NEXT: it eq
; R7-RES-NEXT: bleq knr
; R7-RES-NEXT: sub.w r4, r7, #20
; R7-RES-NEXT: mov sp, r4
; R7-RES-NEXT: pop.w {r8, r12}
; R7-RES-NEXT: pop.w {r4, r5, r6, r7, lr}
; R7-RES-NEXT: aut r12, lr, sp
; R7-RES-NEXT: bx lr
;
; R7-ABI-LABEL: test3:
; R7-ABI: .cfi_startproc
; R7-ABI-NEXT: @ %bb.0: @ %entry
; R7-ABI-NEXT: pac r12, lr, sp
; R7-ABI-NEXT: .save {r4, r5, r6, r7, lr}
; R7-ABI-NEXT: push {r4, r5, r6, r7, lr}
; R7-ABI-NEXT: .cfi_def_cfa_offset 20
; R7-ABI-NEXT: .cfi_offset lr, -4
; R7-ABI-NEXT: .cfi_offset r7, -8
; R7-ABI-NEXT: .cfi_offset r6, -12
; R7-ABI-NEXT: .cfi_offset r5, -16
; R7-ABI-NEXT: .cfi_offset r4, -20
; R7-ABI-NEXT: .setfp r7, sp, #12
; R7-ABI-NEXT: add r7, sp, #12
; R7-ABI-NEXT: .cfi_def_cfa r7, 8
; R7-ABI-NEXT: .save {r8, ra_auth_code}
; R7-ABI-NEXT: push.w {r8, r12}
; R7-ABI-NEXT: .cfi_offset ra_auth_code, -24
; R7-ABI-NEXT: .cfi_offset r8, -28
; R7-ABI-NEXT: .pad #4
; R7-ABI-NEXT: sub sp, #4
; R7-ABI-NEXT: cmp r0, #0
; R7-ABI-NEXT: mov r5, r2
; R7-ABI-NEXT: mov r4, r1
; R7-ABI-NEXT: it ne
; R7-ABI-NEXT: blne knr
; R7-ABI-NEXT: adds r0, r5, #7
; R7-ABI-NEXT: bic r0, r0, #7
; R7-ABI-NEXT: sub.w r0, sp, r0
; R7-ABI-NEXT: mov sp, r0
; R7-ABI-NEXT: bl take_ptr
; R7-ABI-NEXT: mov r0, r4
; R7-ABI-NEXT: movs r1, #0
; R7-ABI-NEXT: bl __aeabi_fcmpeq
; R7-ABI-NEXT: cmp r0, #0
; R7-ABI-NEXT: it eq
; R7-ABI-NEXT: bleq knr
; R7-ABI-NEXT: sub.w r4, r7, #20
; R7-ABI-NEXT: mov sp, r4
; R7-ABI-NEXT: pop.w {r8, r12}
; R7-ABI-NEXT: pop.w {r4, r5, r6, r7, lr}
; R7-ABI-NEXT: aut r12, lr, sp
; R7-ABI-NEXT: bx lr
;
; R11-LABEL: test3:
; R11: .cfi_startproc
; R11-NEXT: @ %bb.0: @ %entry
; R11-NEXT: pac r12, lr, sp
; R11-NEXT: .save {r4, r5, r6, r7, r11, ra_auth_code, lr}
; R11-NEXT: push.w {r4, r5, r6, r7, r11, r12, lr}
; R11-NEXT: .cfi_def_cfa_offset 28
; R11-NEXT: .cfi_offset lr, -4
; R11-NEXT: .cfi_offset ra_auth_code, -8
; R11-NEXT: .cfi_offset r11, -12
; R11-NEXT: .cfi_offset r7, -16
; R11-NEXT: .cfi_offset r6, -20
; R11-NEXT: .cfi_offset r5, -24
; R11-NEXT: .cfi_offset r4, -28
; R11-NEXT: .setfp r11, sp, #16
; R11-NEXT: add.w r11, sp, #16
; R11-NEXT: .cfi_def_cfa r11, 12
; R11-NEXT: .pad #4
; R11-NEXT: sub sp, #4
; R11-NEXT: cmp r0, #0
; R11-NEXT: mov r5, r2
; R11-NEXT: mov r4, r1
; R11-NEXT: it ne
; R11-NEXT: blne knr
; R11-NEXT: adds r0, r5, #7
; R11-NEXT: bic r0, r0, #7
; R11-NEXT: sub.w r0, sp, r0
; R11-NEXT: mov sp, r0
; R11-NEXT: bl take_ptr
; R11-NEXT: mov r0, r4
; R11-NEXT: movs r1, #0
; R11-NEXT: bl __aeabi_fcmpeq
; R11-NEXT: cmp r0, #0
; R11-NEXT: it eq
; R11-NEXT: bleq knr
; R11-NEXT: sub.w r4, r11, #16
; R11-NEXT: mov sp, r4
; R11-NEXT: pop.w {r4, r5, r6, r7, r11, r12, lr}
; R11-NEXT: aut r12, lr, sp
; R11-NEXT: bx lr
;
; R11-RES-LABEL: test3:
; R11-RES: .cfi_startproc
; R11-RES-NEXT: @ %bb.0: @ %entry
; R11-RES-NEXT: pac r12, lr, sp
; R11-RES-NEXT: .save {r4, r5, r6, r7, ra_auth_code}
; R11-RES-NEXT: push.w {r4, r5, r6, r7, r12}
; R11-RES-NEXT: .cfi_def_cfa_offset 20
; R11-RES-NEXT: .cfi_offset ra_auth_code, -4
; R11-RES-NEXT: .cfi_offset r7, -8
; R11-RES-NEXT: .cfi_offset r6, -12
; R11-RES-NEXT: .cfi_offset r5, -16
; R11-RES-NEXT: .cfi_offset r4, -20
; R11-RES-NEXT: .save {r11, lr}
; R11-RES-NEXT: push.w {r11, lr}
; R11-RES-NEXT: .cfi_def_cfa_offset 28
; R11-RES-NEXT: .cfi_offset lr, -24
; R11-RES-NEXT: .cfi_offset r11, -28
; R11-RES-NEXT: .setfp r11, sp
; R11-RES-NEXT: mov r11, sp
; R11-RES-NEXT: .cfi_def_cfa_register r11
; R11-RES-NEXT: .pad #4
; R11-RES-NEXT: sub sp, #4
; R11-RES-NEXT: cmp r0, #0
; R11-RES-NEXT: mov r5, r2
; R11-RES-NEXT: mov r4, r1
; R11-RES-NEXT: it ne
; R11-RES-NEXT: blne knr
; R11-RES-NEXT: adds r0, r5, #7
; R11-RES-NEXT: bic r0, r0, #7
; R11-RES-NEXT: sub.w r0, sp, r0
; R11-RES-NEXT: mov sp, r0
; R11-RES-NEXT: bl take_ptr
; R11-RES-NEXT: mov r0, r4
; R11-RES-NEXT: movs r1, #0
; R11-RES-NEXT: bl __aeabi_fcmpeq
; R11-RES-NEXT: cmp r0, #0
; R11-RES-NEXT: it eq
; R11-RES-NEXT: bleq knr
; R11-RES-NEXT: mov sp, r11
; R11-RES-NEXT: pop.w {r11, lr}
; R11-RES-NEXT: pop.w {r4, r5, r6, r7, r12}
; R11-RES-NEXT: aut r12, lr, sp
; R11-RES-NEXT: bx lr
;
; R11-ABI-LABEL: test3:
; R11-ABI: .cfi_startproc
; R11-ABI-NEXT: @ %bb.0: @ %entry
; R11-ABI-NEXT: pac r12, lr, sp
; R11-ABI-NEXT: .save {r4, r5, r6, r7, ra_auth_code}
; R11-ABI-NEXT: push.w {r4, r5, r6, r7, r12}
; R11-ABI-NEXT: .cfi_def_cfa_offset 20
; R11-ABI-NEXT: .cfi_offset ra_auth_code, -4
; R11-ABI-NEXT: .cfi_offset r7, -8
; R11-ABI-NEXT: .cfi_offset r6, -12
; R11-ABI-NEXT: .cfi_offset r5, -16
; R11-ABI-NEXT: .cfi_offset r4, -20
; R11-ABI-NEXT: .save {r11, lr}
; R11-ABI-NEXT: push.w {r11, lr}
; R11-ABI-NEXT: .cfi_def_cfa_offset 28
; R11-ABI-NEXT: .cfi_offset lr, -24
; R11-ABI-NEXT: .cfi_offset r11, -28
; R11-ABI-NEXT: .setfp r11, sp
; R11-ABI-NEXT: mov r11, sp
; R11-ABI-NEXT: .cfi_def_cfa_register r11
; R11-ABI-NEXT: .pad #4
; R11-ABI-NEXT: sub sp, #4
; R11-ABI-NEXT: cmp r0, #0
; R11-ABI-NEXT: mov r5, r2
; R11-ABI-NEXT: mov r4, r1
; R11-ABI-NEXT: it ne
; R11-ABI-NEXT: blne knr
; R11-ABI-NEXT: adds r0, r5, #7
; R11-ABI-NEXT: bic r0, r0, #7
; R11-ABI-NEXT: sub.w r0, sp, r0
; R11-ABI-NEXT: mov sp, r0
; R11-ABI-NEXT: bl take_ptr
; R11-ABI-NEXT: mov r0, r4
; R11-ABI-NEXT: movs r1, #0
; R11-ABI-NEXT: bl __aeabi_fcmpeq
; R11-ABI-NEXT: cmp r0, #0
; R11-ABI-NEXT: it eq
; R11-ABI-NEXT: bleq knr
; R11-ABI-NEXT: mov sp, r11
; R11-ABI-NEXT: pop.w {r11, lr}
; R11-ABI-NEXT: pop.w {r4, r5, r6, r7, r12}
; R11-ABI-NEXT: aut r12, lr, sp
; R11-ABI-NEXT: bx lr
entry:
%tobool.not = icmp eq i32 %c, 0
br i1 %tobool.not, label %if.end, label %if.then
if.then: ; preds = %entry
tail call void @knr()
br label %if.end
if.end: ; preds = %if.then, %entry
%0 = alloca i8, i32 %z, align 8
call void @take_ptr(ptr noundef nonnull %0)
%tobool1 = fcmp une float %e, 0.000000e+00
br i1 %tobool1, label %if.then2, label %if.end3
if.then2: ; preds = %if.end
call void @knr()
br label %if.end3
if.end3: ; preds = %if.then2, %if.end
ret void
}
declare void @knr(...)
declare void @take_ptr(ptr noundef)