147 lines · plain
1; RUN: llc --force-dwarf-frame-section --exception-model=arm %s -o - --target-abi=aapcs16 | FileCheck %s2; RUN: llc --filetype=obj %s --exception-model=arm -o - --target-abi=aapcs16 | llvm-readelf -s --unwind - | FileCheck %s --check-prefix=UNWIND3target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"4 5; Triple tweaked so we get 16-byte stack alignment and better test coverage.6target triple = "armv7m-none-linux-android"7 8; -Oz9; volatile int a, b, c, d, e, f, g, h, i;10;11; int x() {12; int r = (a + b) / (c + d) + e + f / g + h + i;13; return r + 1;14; }15;16; int y() {17; int r = (a + b) / (c + d) + e + f / g + h + i;18; return r + 2;19; }20 21@a = hidden global i32 0, align 422@b = hidden global i32 0, align 423@c = hidden global i32 0, align 424@d = hidden global i32 0, align 425@e = hidden global i32 0, align 426@f = hidden global i32 0, align 427@g = hidden global i32 0, align 428@h = hidden global i32 0, align 429@i = hidden global i32 0, align 430 31 32define hidden i32 @x() local_unnamed_addr #0 {33entry:34 %0 = load volatile i32, ptr @a, align 435 %1 = load volatile i32, ptr @b, align 436 %add = add nsw i32 %1, %037 %2 = load volatile i32, ptr @c, align 438 %3 = load volatile i32, ptr @d, align 439 %add1 = add nsw i32 %3, %240 %div = sdiv i32 %add, %add141 %4 = load volatile i32, ptr @e, align 442 %5 = load volatile i32, ptr @f, align 443 %6 = load volatile i32, ptr @g, align 444 %div3 = sdiv i32 %5, %645 %7 = load volatile i32, ptr @h, align 446 %8 = load volatile i32, ptr @i, align 447 %add2 = add i32 %div, 148 %add4 = add i32 %add2, %449 %add5 = add i32 %add4, %div350 %add6 = add i32 %add5, %751 %add7 = add i32 %add6, %852 ret i32 %add753}54 55; CHECK-LABEL: x:56; CHECK: ldr r0, .LCPI0_057; CHECK-NEXT: pac r12, lr, sp58; CHECK-NEXT: .pad #859; CHECK-NEXT: .save {ra_auth_code, lr}60; CHECK-NEXT: strd r12, lr, [sp, #-16]!61; CHECK-NEXT: .cfi_def_cfa_offset 1662; CHECK-NEXT: .cfi_offset lr, -1263; CHECK-NEXT: .cfi_offset ra_auth_code, -1664; CHECK-NEXT: bl OUTLINED_FUNCTION_065; CHECK-NEXT: ldrd r12, lr, [sp], #1666; CHECK-NEXT: .cfi_def_cfa_offset 067; CHECK-NEXT: .cfi_restore lr68; CHECK-NEXT: .cfi_undefined ra_auth_code69; CHECK-NEXT: aut r12, lr, sp70; CHECK-NEXT: adds r0, #171; CHECK-NEXT: bx lr72 73define hidden i32 @y() local_unnamed_addr #0 {74entry:75 %0 = load volatile i32, ptr @a, align 476 %1 = load volatile i32, ptr @b, align 477 %add = add nsw i32 %1, %078 %2 = load volatile i32, ptr @c, align 479 %3 = load volatile i32, ptr @d, align 480 %add1 = add nsw i32 %3, %281 %div = sdiv i32 %add, %add182 %4 = load volatile i32, ptr @e, align 483 %5 = load volatile i32, ptr @f, align 484 %6 = load volatile i32, ptr @g, align 485 %div3 = sdiv i32 %5, %686 %7 = load volatile i32, ptr @h, align 487 %8 = load volatile i32, ptr @i, align 488 %add2 = add i32 %div, 289 %add4 = add i32 %add2, %490 %add5 = add i32 %add4, %div391 %add6 = add i32 %add5, %792 %add7 = add i32 %add6, %893 ret i32 %add794}95; CHECK-LABEL: y:96; CHECK: ldr r0, .LCPI1_097; CHECK-NEXT: pac r12, lr, sp98; CHECK-NEXT: .pad #899; CHECK-NEXT: .save {ra_auth_code, lr}100; CHECK-NEXT: strd r12, lr, [sp, #-16]!101; CHECK-NEXT: .cfi_def_cfa_offset 16102; CHECK-NEXT: .cfi_offset lr, -12103; CHECK-NEXT: .cfi_offset ra_auth_code, -16104; CHECK-NEXT: bl OUTLINED_FUNCTION_0105; CHECK-NEXT: ldrd r12, lr, [sp], #16106; CHECK-NEXT: .cfi_def_cfa_offset 0107; CHECK-NEXT: .cfi_restore lr108; CHECK-NEXT: .cfi_undefined ra_auth_code109; CHECK-NEXT: aut r12, lr, sp110; CHECK-NEXT: adds r0, #2111; CHECK-NEXT: bx lr112 113; CHECK-LABEL: OUTLINED_FUNCTION_0:114; CHECK-NOT: pac115; CHECK-NOT: aut116; CHECK-NOT: r12117; CHECK: bx lr118 119attributes #0 = { minsize nofree norecurse nounwind optsize uwtable "sign-return-address"="non-leaf"}120 121!llvm.module.flags = !{!0, !1, !2}122 123!0 = !{i32 8, !"branch-target-enforcement", i32 0}124!1 = !{i32 8, !"sign-return-address", i32 1}125!2 = !{i32 8, !"sign-return-address-all", i32 0}126 127; UNWIND-LABEL: FunctionAddress: 0x0128; UNWIND: 0xB4 ; pop ra_auth_code129; UNWIND-NEXT: 0x84 0x00 ; pop {lr}130; UNWIND-NEXT: 0x01 ; vsp = vsp + 8131; UNWIND-NEXT: 0xB0 ; finish132 133; UNWIND-LABEL: FunctionAddress: 0x20134; UNWIND: 0xB4 ; pop ra_auth_code135; UNWIND-NEXT: 0x84 0x00 ; pop {lr}136; UNWIND-NEXT: 0x01 ; vsp = vsp + 8137; UNWIND-NEXT: 0xB0 ; finish138 139; UNWIND-LABEL: FunctionAddress: 0x40140; UNWIND: Opcodes [141; UNWIND-NEXT: 0xB0 ; finish142 143 144; UNWINND-LABEL: 00000041 {{.*}} OUTLINED_FUNCTION_0145; UNWINND-LABEL: 00000001 {{.*}} x146; UNWINND-LABEL: 00000021 {{.*}} y147