441 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=none -verify-machineinstrs | FileCheck %s --check-prefix=FP-NONE3; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=all -verify-machineinstrs | FileCheck %s --check-prefix=FP-ALL4; RUN: llc < %s -mtriple=thumbv6m-none-eabi -frame-pointer=all -mattr=+aapcs-frame-chain -verify-machineinstrs | FileCheck %s --check-prefix=FP-AAPCS5 6define void @ra_call() {7; FP-NONE-LABEL: ra_call:8; FP-NONE: @ %bb.0: @ %entry9; FP-NONE-NEXT: .save {r7, lr}10; FP-NONE-NEXT: push {r7, lr}11; FP-NONE-NEXT: mov r0, lr12; FP-NONE-NEXT: bl sink_ptr13; FP-NONE-NEXT: pop {r7, pc}14;15; FP-ALL-LABEL: ra_call:16; FP-ALL: @ %bb.0: @ %entry17; FP-ALL-NEXT: .save {r7, lr}18; FP-ALL-NEXT: push {r7, lr}19; FP-ALL-NEXT: .setfp r7, sp20; FP-ALL-NEXT: add r7, sp, #021; FP-ALL-NEXT: mov r0, lr22; FP-ALL-NEXT: bl sink_ptr23; FP-ALL-NEXT: pop {r7, pc}24;25; FP-AAPCS-LABEL: ra_call:26; FP-AAPCS: @ %bb.0: @ %entry27; FP-AAPCS-NEXT: .save {lr}28; FP-AAPCS-NEXT: push {lr}29; FP-AAPCS-NEXT: mov r3, r1130; FP-AAPCS-NEXT: .save {r11}31; FP-AAPCS-NEXT: push {r3}32; FP-AAPCS-NEXT: .setfp r11, sp33; FP-AAPCS-NEXT: mov r11, sp34; FP-AAPCS-NEXT: mov r0, lr35; FP-AAPCS-NEXT: bl sink_ptr36; FP-AAPCS-NEXT: pop {r0}37; FP-AAPCS-NEXT: mov r11, r038; FP-AAPCS-NEXT: pop {pc}39entry:40 %r = tail call ptr @llvm.returnaddress(i32 0)41 tail call void @sink_ptr(ptr %r)42 ret void43}44 45define ptr @ra_return() {46; FP-NONE-LABEL: ra_return:47; FP-NONE: @ %bb.0: @ %entry48; FP-NONE-NEXT: mov r0, lr49; FP-NONE-NEXT: bx lr50;51; FP-ALL-LABEL: ra_return:52; FP-ALL: @ %bb.0: @ %entry53; FP-ALL-NEXT: .save {r7, lr}54; FP-ALL-NEXT: push {r7, lr}55; FP-ALL-NEXT: .setfp r7, sp56; FP-ALL-NEXT: add r7, sp, #057; FP-ALL-NEXT: mov r0, lr58; FP-ALL-NEXT: pop {r7, pc}59;60; FP-AAPCS-LABEL: ra_return:61; FP-AAPCS: @ %bb.0: @ %entry62; FP-AAPCS-NEXT: .save {lr}63; FP-AAPCS-NEXT: push {lr}64; FP-AAPCS-NEXT: mov r3, r1165; FP-AAPCS-NEXT: .save {r11}66; FP-AAPCS-NEXT: push {r3}67; FP-AAPCS-NEXT: .setfp r11, sp68; FP-AAPCS-NEXT: mov r11, sp69; FP-AAPCS-NEXT: mov r0, lr70; FP-AAPCS-NEXT: pop {r1}71; FP-AAPCS-NEXT: mov r11, r172; FP-AAPCS-NEXT: pop {pc}73entry:74 %r = tail call ptr @llvm.returnaddress(i32 0)75 ret ptr %r76}77 78define ptr @callee_saved_low() {79; FP-NONE-LABEL: callee_saved_low:80; FP-NONE: @ %bb.0: @ %entry81; FP-NONE-NEXT: .save {r4, r5, r7, lr}82; FP-NONE-NEXT: push {r4, r5, r7, lr}83; FP-NONE-NEXT: mov r0, lr84; FP-NONE-NEXT: @APP85; FP-NONE-NEXT: @NO_APP86; FP-NONE-NEXT: pop {r4, r5, r7, pc}87;88; FP-ALL-LABEL: callee_saved_low:89; FP-ALL: @ %bb.0: @ %entry90; FP-ALL-NEXT: .save {r4, r5, r7, lr}91; FP-ALL-NEXT: push {r4, r5, r7, lr}92; FP-ALL-NEXT: .setfp r7, sp, #893; FP-ALL-NEXT: add r7, sp, #894; FP-ALL-NEXT: mov r0, lr95; FP-ALL-NEXT: @APP96; FP-ALL-NEXT: @NO_APP97; FP-ALL-NEXT: pop {r4, r5, r7, pc}98;99; FP-AAPCS-LABEL: callee_saved_low:100; FP-AAPCS: @ %bb.0: @ %entry101; FP-AAPCS-NEXT: .save {lr}102; FP-AAPCS-NEXT: push {lr}103; FP-AAPCS-NEXT: mov r3, r11104; FP-AAPCS-NEXT: .save {r11}105; FP-AAPCS-NEXT: push {r3}106; FP-AAPCS-NEXT: .setfp r11, sp107; FP-AAPCS-NEXT: mov r11, sp108; FP-AAPCS-NEXT: .save {r4, r5}109; FP-AAPCS-NEXT: push {r4, r5}110; FP-AAPCS-NEXT: mov r0, lr111; FP-AAPCS-NEXT: @APP112; FP-AAPCS-NEXT: @NO_APP113; FP-AAPCS-NEXT: pop {r4, r5}114; FP-AAPCS-NEXT: pop {r1}115; FP-AAPCS-NEXT: mov r11, r1116; FP-AAPCS-NEXT: pop {pc}117entry:118 call void asm sideeffect "", "~{r4},~{r5}"()119 %r = tail call ptr @llvm.returnaddress(i32 0)120 ret ptr %r121}122 123define ptr @callee_saved_high() {124; FP-NONE-LABEL: callee_saved_high:125; FP-NONE: @ %bb.0: @ %entry126; FP-NONE-NEXT: mov r3, r9127; FP-NONE-NEXT: mov r2, r8128; FP-NONE-NEXT: .save {r8, r9}129; FP-NONE-NEXT: push {r2, r3}130; FP-NONE-NEXT: mov r0, lr131; FP-NONE-NEXT: @APP132; FP-NONE-NEXT: @NO_APP133; FP-NONE-NEXT: pop {r1, r2}134; FP-NONE-NEXT: mov r8, r1135; FP-NONE-NEXT: mov r9, r2136; FP-NONE-NEXT: bx lr137;138; FP-ALL-LABEL: callee_saved_high:139; FP-ALL: @ %bb.0: @ %entry140; FP-ALL-NEXT: .save {r7, lr}141; FP-ALL-NEXT: push {r7, lr}142; FP-ALL-NEXT: .setfp r7, sp143; FP-ALL-NEXT: add r7, sp, #0144; FP-ALL-NEXT: mov r3, r9145; FP-ALL-NEXT: mov r2, r8146; FP-ALL-NEXT: .save {r8, r9}147; FP-ALL-NEXT: push {r2, r3}148; FP-ALL-NEXT: mov r0, lr149; FP-ALL-NEXT: @APP150; FP-ALL-NEXT: @NO_APP151; FP-ALL-NEXT: pop {r1, r2}152; FP-ALL-NEXT: mov r8, r1153; FP-ALL-NEXT: mov r9, r2154; FP-ALL-NEXT: pop {r7, pc}155;156; FP-AAPCS-LABEL: callee_saved_high:157; FP-AAPCS: @ %bb.0: @ %entry158; FP-AAPCS-NEXT: .save {lr}159; FP-AAPCS-NEXT: push {lr}160; FP-AAPCS-NEXT: mov r3, r11161; FP-AAPCS-NEXT: .save {r11}162; FP-AAPCS-NEXT: push {r3}163; FP-AAPCS-NEXT: .setfp r11, sp164; FP-AAPCS-NEXT: mov r11, sp165; FP-AAPCS-NEXT: mov r3, r9166; FP-AAPCS-NEXT: mov r2, r8167; FP-AAPCS-NEXT: .save {r8, r9}168; FP-AAPCS-NEXT: push {r2, r3}169; FP-AAPCS-NEXT: mov r0, lr170; FP-AAPCS-NEXT: @APP171; FP-AAPCS-NEXT: @NO_APP172; FP-AAPCS-NEXT: pop {r1, r2}173; FP-AAPCS-NEXT: mov r8, r1174; FP-AAPCS-NEXT: mov r9, r2175; FP-AAPCS-NEXT: pop {r1}176; FP-AAPCS-NEXT: mov r11, r1177; FP-AAPCS-NEXT: pop {pc}178entry:179 call void asm sideeffect "", "~{r8},~{r9}"()180 %r = tail call ptr @llvm.returnaddress(i32 0)181 ret ptr %r182}183 184define ptr @large_alloca() {185; FP-NONE-LABEL: large_alloca:186; FP-NONE: @ %bb.0: @ %entry187; FP-NONE-NEXT: .save {r4, r5, r6, lr}188; FP-NONE-NEXT: push {r4, r5, r6, lr}189; FP-NONE-NEXT: ldr r6, .LCPI4_0190; FP-NONE-NEXT: .pad #2000191; FP-NONE-NEXT: add sp, r6192; FP-NONE-NEXT: mov r4, lr193; FP-NONE-NEXT: mov r0, sp194; FP-NONE-NEXT: bl sink_ptr195; FP-NONE-NEXT: mov r0, r4196; FP-NONE-NEXT: ldr r6, .LCPI4_1197; FP-NONE-NEXT: add sp, r6198; FP-NONE-NEXT: pop {r4, r5, r6, pc}199; FP-NONE-NEXT: .p2align 2200; FP-NONE-NEXT: @ %bb.1:201; FP-NONE-NEXT: .LCPI4_0:202; FP-NONE-NEXT: .long 4294965296 @ 0xfffff830203; FP-NONE-NEXT: .LCPI4_1:204; FP-NONE-NEXT: .long 2000 @ 0x7d0205;206; FP-ALL-LABEL: large_alloca:207; FP-ALL: @ %bb.0: @ %entry208; FP-ALL-NEXT: .save {r4, r6, r7, lr}209; FP-ALL-NEXT: push {r4, r6, r7, lr}210; FP-ALL-NEXT: .setfp r7, sp, #8211; FP-ALL-NEXT: add r7, sp, #8212; FP-ALL-NEXT: ldr r6, .LCPI4_0213; FP-ALL-NEXT: .pad #2000214; FP-ALL-NEXT: add sp, r6215; FP-ALL-NEXT: mov r4, lr216; FP-ALL-NEXT: mov r0, sp217; FP-ALL-NEXT: bl sink_ptr218; FP-ALL-NEXT: mov r0, r4219; FP-ALL-NEXT: subs r6, r7, #7220; FP-ALL-NEXT: subs r6, #1221; FP-ALL-NEXT: mov sp, r6222; FP-ALL-NEXT: pop {r4, r6, r7, pc}223; FP-ALL-NEXT: .p2align 2224; FP-ALL-NEXT: @ %bb.1:225; FP-ALL-NEXT: .LCPI4_0:226; FP-ALL-NEXT: .long 4294965296 @ 0xfffff830227;228; FP-AAPCS-LABEL: large_alloca:229; FP-AAPCS: @ %bb.0: @ %entry230; FP-AAPCS-NEXT: .save {lr}231; FP-AAPCS-NEXT: push {lr}232; FP-AAPCS-NEXT: mov r3, r11233; FP-AAPCS-NEXT: .save {r11}234; FP-AAPCS-NEXT: push {r3}235; FP-AAPCS-NEXT: .setfp r11, sp236; FP-AAPCS-NEXT: mov r11, sp237; FP-AAPCS-NEXT: .save {r4, r7}238; FP-AAPCS-NEXT: push {r4, r7}239; FP-AAPCS-NEXT: ldr r7, .LCPI4_0240; FP-AAPCS-NEXT: .pad #2000241; FP-AAPCS-NEXT: add sp, r7242; FP-AAPCS-NEXT: mov r4, lr243; FP-AAPCS-NEXT: mov r0, sp244; FP-AAPCS-NEXT: bl sink_ptr245; FP-AAPCS-NEXT: mov r0, r4246; FP-AAPCS-NEXT: mov r7, r11247; FP-AAPCS-NEXT: subs r7, #8248; FP-AAPCS-NEXT: mov sp, r7249; FP-AAPCS-NEXT: pop {r4, r7}250; FP-AAPCS-NEXT: pop {r1}251; FP-AAPCS-NEXT: mov r11, r1252; FP-AAPCS-NEXT: pop {pc}253; FP-AAPCS-NEXT: .p2align 2254; FP-AAPCS-NEXT: @ %bb.1:255; FP-AAPCS-NEXT: .LCPI4_0:256; FP-AAPCS-NEXT: .long 4294965296 @ 0xfffff830257entry:258 %big = alloca i8, i32 2000259 tail call void @sink_ptr(ptr %big)260 %r = tail call ptr @llvm.returnaddress(i32 0)261 ret ptr %r262}263 264define ptr @var_alloca(i32 %size) {265; FP-NONE-LABEL: var_alloca:266; FP-NONE: @ %bb.0: @ %entry267; FP-NONE-NEXT: .save {r4, r6, r7, lr}268; FP-NONE-NEXT: push {r4, r6, r7, lr}269; FP-NONE-NEXT: .setfp r7, sp, #8270; FP-NONE-NEXT: add r7, sp, #8271; FP-NONE-NEXT: mov r6, sp272; FP-NONE-NEXT: mov r4, lr273; FP-NONE-NEXT: adds r0, r0, #7274; FP-NONE-NEXT: movs r1, #7275; FP-NONE-NEXT: bics r0, r1276; FP-NONE-NEXT: mov r1, sp277; FP-NONE-NEXT: subs r0, r1, r0278; FP-NONE-NEXT: mov sp, r0279; FP-NONE-NEXT: bl sink_ptr280; FP-NONE-NEXT: mov r0, r4281; FP-NONE-NEXT: subs r6, r7, #7282; FP-NONE-NEXT: subs r6, #1283; FP-NONE-NEXT: mov sp, r6284; FP-NONE-NEXT: pop {r4, r6, r7, pc}285;286; FP-ALL-LABEL: var_alloca:287; FP-ALL: @ %bb.0: @ %entry288; FP-ALL-NEXT: .save {r4, r6, r7, lr}289; FP-ALL-NEXT: push {r4, r6, r7, lr}290; FP-ALL-NEXT: .setfp r7, sp, #8291; FP-ALL-NEXT: add r7, sp, #8292; FP-ALL-NEXT: mov r6, sp293; FP-ALL-NEXT: mov r4, lr294; FP-ALL-NEXT: adds r0, r0, #7295; FP-ALL-NEXT: movs r1, #7296; FP-ALL-NEXT: bics r0, r1297; FP-ALL-NEXT: mov r1, sp298; FP-ALL-NEXT: subs r0, r1, r0299; FP-ALL-NEXT: mov sp, r0300; FP-ALL-NEXT: bl sink_ptr301; FP-ALL-NEXT: mov r0, r4302; FP-ALL-NEXT: subs r6, r7, #7303; FP-ALL-NEXT: subs r6, #1304; FP-ALL-NEXT: mov sp, r6305; FP-ALL-NEXT: pop {r4, r6, r7, pc}306;307; FP-AAPCS-LABEL: var_alloca:308; FP-AAPCS: @ %bb.0: @ %entry309; FP-AAPCS-NEXT: .save {lr}310; FP-AAPCS-NEXT: push {lr}311; FP-AAPCS-NEXT: mov r3, r11312; FP-AAPCS-NEXT: .save {r11}313; FP-AAPCS-NEXT: push {r3}314; FP-AAPCS-NEXT: .setfp r11, sp315; FP-AAPCS-NEXT: mov r11, sp316; FP-AAPCS-NEXT: .save {r4, r6}317; FP-AAPCS-NEXT: push {r4, r6}318; FP-AAPCS-NEXT: mov r6, sp319; FP-AAPCS-NEXT: mov r4, lr320; FP-AAPCS-NEXT: adds r0, r0, #7321; FP-AAPCS-NEXT: movs r1, #7322; FP-AAPCS-NEXT: bics r0, r1323; FP-AAPCS-NEXT: mov r1, sp324; FP-AAPCS-NEXT: subs r0, r1, r0325; FP-AAPCS-NEXT: mov sp, r0326; FP-AAPCS-NEXT: bl sink_ptr327; FP-AAPCS-NEXT: mov r0, r4328; FP-AAPCS-NEXT: mov r6, r11329; FP-AAPCS-NEXT: subs r6, #8330; FP-AAPCS-NEXT: mov sp, r6331; FP-AAPCS-NEXT: pop {r4, r6}332; FP-AAPCS-NEXT: pop {r1}333; FP-AAPCS-NEXT: mov r11, r1334; FP-AAPCS-NEXT: pop {pc}335entry:336 %var = alloca i8, i32 %size337 tail call void @sink_ptr(ptr %var)338 %r = tail call ptr @llvm.returnaddress(i32 0)339 ret ptr %r340}341 342define i32 @all_arg_regs(i32 %a, i32 %b, i32 %c, i32 %d) {343; FP-NONE-LABEL: all_arg_regs:344; FP-NONE: @ %bb.0: @ %entry345; FP-NONE-NEXT: .save {r4, lr}346; FP-NONE-NEXT: push {r4, lr}347; FP-NONE-NEXT: mov r4, lr348; FP-NONE-NEXT: adds r0, r0, r1349; FP-NONE-NEXT: adds r0, r0, r2350; FP-NONE-NEXT: adds r0, r0, r3351; FP-NONE-NEXT: adds r0, r0, r4352; FP-NONE-NEXT: pop {r4, pc}353;354; FP-ALL-LABEL: all_arg_regs:355; FP-ALL: @ %bb.0: @ %entry356; FP-ALL-NEXT: .save {r4, r6, r7, lr}357; FP-ALL-NEXT: push {r4, r6, r7, lr}358; FP-ALL-NEXT: .setfp r7, sp, #8359; FP-ALL-NEXT: add r7, sp, #8360; FP-ALL-NEXT: mov r4, lr361; FP-ALL-NEXT: adds r0, r0, r1362; FP-ALL-NEXT: adds r0, r0, r2363; FP-ALL-NEXT: adds r0, r0, r3364; FP-ALL-NEXT: adds r0, r0, r4365; FP-ALL-NEXT: pop {r4, r6, r7, pc}366;367; FP-AAPCS-LABEL: all_arg_regs:368; FP-AAPCS: @ %bb.0: @ %entry369; FP-AAPCS-NEXT: .save {lr}370; FP-AAPCS-NEXT: push {lr}371; FP-AAPCS-NEXT: mov lr, r11372; FP-AAPCS-NEXT: .save {r11}373; FP-AAPCS-NEXT: push {lr}374; FP-AAPCS-NEXT: .setfp r11, sp375; FP-AAPCS-NEXT: mov r11, sp376; FP-AAPCS-NEXT: .save {r4, r7}377; FP-AAPCS-NEXT: push {r4, r7}378; FP-AAPCS-NEXT: ldr r7, [sp, #12]379; FP-AAPCS-NEXT: mov lr, r7380; FP-AAPCS-NEXT: mov r4, lr381; FP-AAPCS-NEXT: adds r0, r0, r1382; FP-AAPCS-NEXT: adds r0, r0, r2383; FP-AAPCS-NEXT: adds r0, r0, r3384; FP-AAPCS-NEXT: adds r0, r0, r4385; FP-AAPCS-NEXT: pop {r4, r7}386; FP-AAPCS-NEXT: pop {r1}387; FP-AAPCS-NEXT: mov r11, r1388; FP-AAPCS-NEXT: pop {pc}389entry:390 %r = tail call ptr @llvm.returnaddress(i32 0)391 %ri = ptrtoint ptr %r to i32392 %t1 = add i32 %a, %b393 %t2 = add i32 %t1, %c394 %t3 = add i32 %t2, %d395 %t4 = add i32 %t3, %ri396 ret i32 %t4397}398 399define ptr @ra_depth_1() {400; FP-NONE-LABEL: ra_depth_1:401; FP-NONE: @ %bb.0: @ %entry402; FP-NONE-NEXT: .save {r7, lr}403; FP-NONE-NEXT: push {r7, lr}404; FP-NONE-NEXT: .setfp r7, sp405; FP-NONE-NEXT: add r7, sp, #0406; FP-NONE-NEXT: ldr r0, [r7]407; FP-NONE-NEXT: ldr r0, [r0, #4]408; FP-NONE-NEXT: pop {r7, pc}409;410; FP-ALL-LABEL: ra_depth_1:411; FP-ALL: @ %bb.0: @ %entry412; FP-ALL-NEXT: .save {r7, lr}413; FP-ALL-NEXT: push {r7, lr}414; FP-ALL-NEXT: .setfp r7, sp415; FP-ALL-NEXT: add r7, sp, #0416; FP-ALL-NEXT: ldr r0, [r7]417; FP-ALL-NEXT: ldr r0, [r0, #4]418; FP-ALL-NEXT: pop {r7, pc}419;420; FP-AAPCS-LABEL: ra_depth_1:421; FP-AAPCS: @ %bb.0: @ %entry422; FP-AAPCS-NEXT: .save {lr}423; FP-AAPCS-NEXT: push {lr}424; FP-AAPCS-NEXT: mov r3, r11425; FP-AAPCS-NEXT: .save {r11}426; FP-AAPCS-NEXT: push {r3}427; FP-AAPCS-NEXT: .setfp r11, sp428; FP-AAPCS-NEXT: mov r11, sp429; FP-AAPCS-NEXT: mov r0, r11430; FP-AAPCS-NEXT: ldr r0, [r0]431; FP-AAPCS-NEXT: ldr r0, [r0, #4]432; FP-AAPCS-NEXT: pop {r1}433; FP-AAPCS-NEXT: mov r11, r1434; FP-AAPCS-NEXT: pop {pc}435entry:436 %r = tail call ptr @llvm.returnaddress(i32 1)437 ret ptr %r438}439 440declare void @sink_ptr(ptr)441