317 lines · plain
1; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=all --verify-machineinstrs | FileCheck %s --check-prefixes=FP,LEAF-FP2; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=all -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-FP-AAPCS3; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf --verify-machineinstrs | FileCheck %s --check-prefixes=FP,LEAF-NOFP4; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-NOFP-AAPCS5; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=none --verify-machineinstrs | FileCheck %s --check-prefixes=NOFP,LEAF-NOFP6; RUN: llc -mtriple thumbv6m-arm-none-eabi -filetype asm -o - %s -frame-pointer=none -mattr=+aapcs-frame-chain --verify-machineinstrs | FileCheck %s --check-prefixes=NOFP-AAPCS,LEAF-NOFP-AAPCS7 8define dso_local noundef i32 @leaf(i32 noundef %0) {9; LEAF-FP-LABEL: leaf:10; LEAF-FP: @ %bb.0:11; LEAF-FP-NEXT: .save {r7, lr}12; LEAF-FP-NEXT: push {r7, lr}13; LEAF-FP-NEXT: .setfp r7, sp14; LEAF-FP-NEXT: add r7, sp, #015; LEAF-FP-NEXT: .pad #416; LEAF-FP-NEXT: sub sp, #417; LEAF-FP-NEXT: str r0, [sp]18; LEAF-FP-NEXT: adds r0, r0, #419; LEAF-FP-NEXT: add sp, #420; LEAF-FP-NEXT: pop {r7, pc}21;22; LEAF-FP-AAPCS-LABEL: leaf:23; LEAF-FP-AAPCS: @ %bb.0:24; LEAF-FP-AAPCS-NEXT: .save {lr}25; LEAF-FP-AAPCS-NEXT: push {lr}26; LEAF-FP-AAPCS-NEXT: mov r3, r1127; LEAF-FP-AAPCS-NEXT: .save {r11}28; LEAF-FP-AAPCS-NEXT: push {r3}29; LEAF-FP-AAPCS-NEXT: .setfp r11, sp30; LEAF-FP-AAPCS-NEXT: mov r11, sp31; LEAF-FP-AAPCS-NEXT: .pad #432; LEAF-FP-AAPCS-NEXT: sub sp, #433; LEAF-FP-AAPCS-NEXT: str r0, [sp]34; LEAF-FP-AAPCS-NEXT: adds r0, r0, #435; LEAF-FP-AAPCS-NEXT: add sp, #436; LEAF-FP-AAPCS-NEXT: pop {r1}37; LEAF-FP-AAPCS-NEXT: mov r11, r138; LEAF-FP-AAPCS-NEXT: pop {pc}39;40; LEAF-NOFP-LABEL: leaf:41; LEAF-NOFP: @ %bb.0:42; LEAF-NOFP-NEXT: .pad #443; LEAF-NOFP-NEXT: sub sp, #444; LEAF-NOFP-NEXT: str r0, [sp]45; LEAF-NOFP-NEXT: adds r0, r0, #446; LEAF-NOFP-NEXT: add sp, #447; LEAF-NOFP-NEXT: bx lr48;49; LEAF-NOFP-AAPCS-LABEL: leaf:50; LEAF-NOFP-AAPCS: @ %bb.0:51; LEAF-NOFP-AAPCS-NEXT: .pad #452; LEAF-NOFP-AAPCS-NEXT: sub sp, #453; LEAF-NOFP-AAPCS-NEXT: str r0, [sp]54; LEAF-NOFP-AAPCS-NEXT: adds r0, r0, #455; LEAF-NOFP-AAPCS-NEXT: add sp, #456; LEAF-NOFP-AAPCS-NEXT: bx lr57 %2 = alloca i32, align 458 store i32 %0, ptr %2, align 459 %3 = load i32, ptr %2, align 460 %4 = add nsw i32 %3, 461 ret i32 %462}63 64define dso_local noundef i32 @non_leaf(i32 noundef %0) {65; FP-LABEL: non_leaf:66; FP: @ %bb.0:67; FP-NEXT: .save {r7, lr}68; FP-NEXT: push {r7, lr}69; FP-NEXT: .setfp r7, sp70; FP-NEXT: add r7, sp, #071; FP-NEXT: .pad #872; FP-NEXT: sub sp, #873; FP-NEXT: str r0, [sp, #4]74; FP-NEXT: bl leaf75; FP-NEXT: adds r0, r0, #176; FP-NEXT: add sp, #877; FP-NEXT: pop {r7, pc}78;79; FP-AAPCS-LABEL: non_leaf:80; FP-AAPCS: @ %bb.0:81; FP-AAPCS-NEXT: .save {lr}82; FP-AAPCS-NEXT: push {lr}83; FP-AAPCS-NEXT: mov r3, r1184; FP-AAPCS-NEXT: .save {r11}85; FP-AAPCS-NEXT: push {r3}86; FP-AAPCS-NEXT: .setfp r11, sp87; FP-AAPCS-NEXT: mov r11, sp88; FP-AAPCS-NEXT: .pad #889; FP-AAPCS-NEXT: sub sp, #890; FP-AAPCS-NEXT: str r0, [sp, #4]91; FP-AAPCS-NEXT: bl leaf92; FP-AAPCS-NEXT: adds r0, r0, #193; FP-AAPCS-NEXT: add sp, #894; FP-AAPCS-NEXT: pop {r1}95; FP-AAPCS-NEXT: mov r11, r196; FP-AAPCS-NEXT: pop {pc}97;98; NOFP-LABEL: non_leaf:99; NOFP: @ %bb.0:100; NOFP-NEXT: .save {r7, lr}101; NOFP-NEXT: push {r7, lr}102; NOFP-NEXT: .pad #8103; NOFP-NEXT: sub sp, #8104; NOFP-NEXT: str r0, [sp, #4]105; NOFP-NEXT: bl leaf106; NOFP-NEXT: adds r0, r0, #1107; NOFP-NEXT: add sp, #8108; NOFP-NEXT: pop {r7, pc}109;110; NOFP-AAPCS-LABEL: non_leaf:111; NOFP-AAPCS: @ %bb.0:112; NOFP-AAPCS-NEXT: .save {r7, lr}113; NOFP-AAPCS-NEXT: push {r7, lr}114; NOFP-AAPCS-NEXT: .pad #8115; NOFP-AAPCS-NEXT: sub sp, #8116; NOFP-AAPCS-NEXT: str r0, [sp, #4]117; NOFP-AAPCS-NEXT: bl leaf118; NOFP-AAPCS-NEXT: adds r0, r0, #1119; NOFP-AAPCS-NEXT: add sp, #8120; NOFP-AAPCS-NEXT: pop {r7, pc}121 %2 = alloca i32, align 4122 store i32 %0, ptr %2, align 4123 %3 = load i32, ptr %2, align 4124 %4 = call noundef i32 @leaf(i32 noundef %3)125 %5 = add nsw i32 %4, 1126 ret i32 %5127}128 129declare ptr @llvm.stacksave()130define dso_local void @required_fp(i32 %0, i32 %1) {131; FP-LABEL: required_fp:132; FP: @ %bb.0:133; FP-NEXT: .save {r4, r6, r7, lr}134; FP-NEXT: push {r4, r6, r7, lr}135; FP-NEXT: .setfp r7, sp, #8136; FP-NEXT: add r7, sp, #8137; FP-NEXT: .pad #24138; FP-NEXT: sub sp, #24139; FP-NEXT: mov r6, sp140; FP-NEXT: mov r2, r6141; FP-NEXT: str r1, [r2, #16]142; FP-NEXT: str r0, [r2, #20]143; FP-NEXT: mov r1, sp144; FP-NEXT: str r1, [r2, #8]145; FP-NEXT: lsls r1, r0, #2146; FP-NEXT: adds r1, r1, #7147; FP-NEXT: movs r3, #7148; FP-NEXT: bics r1, r3149; FP-NEXT: mov r3, sp150; FP-NEXT: subs r1, r3, r1151; FP-NEXT: mov sp, r1152; FP-NEXT: movs r1, #0153; FP-NEXT: str r1, [r6, #4]154; FP-NEXT: str r0, [r2]155; FP-NEXT: subs r6, r7, #7156; FP-NEXT: subs r6, #1157; FP-NEXT: mov sp, r6158; FP-NEXT: pop {r4, r6, r7, pc}159;160; FP-AAPCS-LABEL: required_fp:161; FP-AAPCS: @ %bb.0:162; FP-AAPCS-NEXT: .save {lr}163; FP-AAPCS-NEXT: push {lr}164; FP-AAPCS-NEXT: mov r3, r11165; FP-AAPCS-NEXT: .save {r11}166; FP-AAPCS-NEXT: push {r3}167; FP-AAPCS-NEXT: .setfp r11, sp168; FP-AAPCS-NEXT: mov r11, sp169; FP-AAPCS-NEXT: .save {r4, r6}170; FP-AAPCS-NEXT: push {r4, r6}171; FP-AAPCS-NEXT: .pad #24172; FP-AAPCS-NEXT: sub sp, #24173; FP-AAPCS-NEXT: mov r6, sp174; FP-AAPCS-NEXT: mov r2, r6175; FP-AAPCS-NEXT: str r1, [r2, #16]176; FP-AAPCS-NEXT: str r0, [r2, #20]177; FP-AAPCS-NEXT: mov r1, sp178; FP-AAPCS-NEXT: str r1, [r2, #8]179; FP-AAPCS-NEXT: lsls r1, r0, #2180; FP-AAPCS-NEXT: adds r1, r1, #7181; FP-AAPCS-NEXT: movs r3, #7182; FP-AAPCS-NEXT: bics r1, r3183; FP-AAPCS-NEXT: mov r3, sp184; FP-AAPCS-NEXT: subs r1, r3, r1185; FP-AAPCS-NEXT: mov sp, r1186; FP-AAPCS-NEXT: movs r1, #0187; FP-AAPCS-NEXT: str r1, [r6, #4]188; FP-AAPCS-NEXT: str r0, [r2]189; FP-AAPCS-NEXT: mov r6, r11190; FP-AAPCS-NEXT: subs r6, #8191; FP-AAPCS-NEXT: mov sp, r6192; FP-AAPCS-NEXT: pop {r4, r6}193; FP-AAPCS-NEXT: pop {r0}194; FP-AAPCS-NEXT: mov r11, r0195; FP-AAPCS-NEXT: pop {pc}196;197; NOFP-LABEL: required_fp:198; NOFP: @ %bb.0:199; NOFP-NEXT: .save {r4, r6, r7, lr}200; NOFP-NEXT: push {r4, r6, r7, lr}201; NOFP-NEXT: .setfp r7, sp, #8202; NOFP-NEXT: add r7, sp, #8203; NOFP-NEXT: .pad #24204; NOFP-NEXT: sub sp, #24205; NOFP-NEXT: mov r6, sp206; NOFP-NEXT: mov r2, r6207; NOFP-NEXT: str r1, [r2, #16]208; NOFP-NEXT: str r0, [r2, #20]209; NOFP-NEXT: mov r1, sp210; NOFP-NEXT: str r1, [r2, #8]211; NOFP-NEXT: lsls r1, r0, #2212; NOFP-NEXT: adds r1, r1, #7213; NOFP-NEXT: movs r3, #7214; NOFP-NEXT: bics r1, r3215; NOFP-NEXT: mov r3, sp216; NOFP-NEXT: subs r1, r3, r1217; NOFP-NEXT: mov sp, r1218; NOFP-NEXT: movs r1, #0219; NOFP-NEXT: str r1, [r6, #4]220; NOFP-NEXT: str r0, [r2]221; NOFP-NEXT: subs r6, r7, #7222; NOFP-NEXT: subs r6, #1223; NOFP-NEXT: mov sp, r6224; NOFP-NEXT: pop {r4, r6, r7, pc}225;226; NOFP-AAPCS-LABEL: required_fp:227; NOFP-AAPCS: @ %bb.0:228; NOFP-AAPCS-NEXT: .save {lr}229; NOFP-AAPCS-NEXT: push {lr}230; NOFP-AAPCS-NEXT: mov r3, r11231; NOFP-AAPCS-NEXT: .save {r11}232; NOFP-AAPCS-NEXT: push {r3}233; NOFP-AAPCS-NEXT: .setfp r11, sp234; NOFP-AAPCS-NEXT: mov r11, sp235; NOFP-AAPCS-NEXT: .save {r4, r6}236; NOFP-AAPCS-NEXT: push {r4, r6}237; NOFP-AAPCS-NEXT: .pad #24238; NOFP-AAPCS-NEXT: sub sp, #24239; NOFP-AAPCS-NEXT: mov r6, sp240; NOFP-AAPCS-NEXT: mov r2, r6241; NOFP-AAPCS-NEXT: str r1, [r2, #16]242; NOFP-AAPCS-NEXT: str r0, [r2, #20]243; NOFP-AAPCS-NEXT: mov r1, sp244; NOFP-AAPCS-NEXT: str r1, [r2, #8]245; NOFP-AAPCS-NEXT: lsls r1, r0, #2246; NOFP-AAPCS-NEXT: adds r1, r1, #7247; NOFP-AAPCS-NEXT: movs r3, #7248; NOFP-AAPCS-NEXT: bics r1, r3249; NOFP-AAPCS-NEXT: mov r3, sp250; NOFP-AAPCS-NEXT: subs r1, r3, r1251; NOFP-AAPCS-NEXT: mov sp, r1252; NOFP-AAPCS-NEXT: movs r1, #0253; NOFP-AAPCS-NEXT: str r1, [r6, #4]254; NOFP-AAPCS-NEXT: str r0, [r2]255; NOFP-AAPCS-NEXT: mov r6, r11256; NOFP-AAPCS-NEXT: subs r6, #8257; NOFP-AAPCS-NEXT: mov sp, r6258; NOFP-AAPCS-NEXT: pop {r4, r6}259; NOFP-AAPCS-NEXT: pop {r0}260; NOFP-AAPCS-NEXT: mov r11, r0261; NOFP-AAPCS-NEXT: pop {pc}262 %3 = alloca i32, align 4263 %4 = alloca i32, align 4264 %5 = alloca ptr, align 8265 %6 = alloca i64, align 8266 store i32 %0, ptr %3, align 4267 store i32 %1, ptr %4, align 4268 %7 = load i32, ptr %3, align 4269 %8 = zext i32 %7 to i64270 %9 = call ptr @llvm.stacksave()271 store ptr %9, ptr %5, align 8272 %10 = alloca i32, i64 %8, align 4273 store i64 %8, ptr %6, align 8274 ret void275}276 277define dso_local noundef i32 @leaf_tailcall(i32 noundef %0) {278; FP-LABEL: leaf_tailcall:279; FP: @ %bb.0:280; FP-NEXT: .save {r7, lr}281; FP-NEXT: push {r7, lr}282; FP-NEXT: .setfp r7, sp283; FP-NEXT: add r7, sp, #0284; FP-NEXT: bl leaf285; FP-NEXT: pop {r7, pc}286;287; FP-AAPCS-LABEL: leaf_tailcall:288; FP-AAPCS: @ %bb.0:289; FP-AAPCS-NEXT: .save {lr}290; FP-AAPCS-NEXT: push {lr}291; FP-AAPCS-NEXT: mov r3, r11292; FP-AAPCS-NEXT: .save {r11}293; FP-AAPCS-NEXT: push {r3}294; FP-AAPCS-NEXT: .setfp r11, sp295; FP-AAPCS-NEXT: mov r11, sp296; FP-AAPCS-NEXT: bl leaf297; FP-AAPCS-NEXT: pop {r1}298; FP-AAPCS-NEXT: mov r11, r1299; FP-AAPCS-NEXT: pop {pc}300;301; NOFP-LABEL: leaf_tailcall:302; NOFP: @ %bb.0:303; NOFP-NEXT: .save {r7, lr}304; NOFP-NEXT: push {r7, lr}305; NOFP-NEXT: bl leaf306; NOFP-NEXT: pop {r7, pc}307;308; NOFP-AAPCS-LABEL: leaf_tailcall:309; NOFP-AAPCS: @ %bb.0:310; NOFP-AAPCS-NEXT: .save {r7, lr}311; NOFP-AAPCS-NEXT: push {r7, lr}312; NOFP-AAPCS-NEXT: bl leaf313; NOFP-AAPCS-NEXT: pop {r7, pc}314 %a = tail call noundef i32 @leaf(i32 noundef %0)315 ret i32 %a316}317