| ; 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) |