256 lines · plain
1; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=all | FileCheck %s --check-prefixes=FP,LEAF-FP2; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=all -mattr=+aapcs-frame-chain | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-FP-AAPCS3; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf | FileCheck %s --check-prefixes=FP,LEAF-NOFP4; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=non-leaf -mattr=+aapcs-frame-chain | FileCheck %s --check-prefixes=FP-AAPCS,LEAF-NOFP-AAPCS5; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=none | FileCheck %s --check-prefixes=NOFP,LEAF-NOFP6; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=none -mattr=+aapcs-frame-chain | FileCheck %s --check-prefixes=NOFP-AAPCS,LEAF-NOFP-AAPCS7; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=reserved | FileCheck %s --check-prefixes=NOFP,LEAF-NOFP8; RUN: llc -mtriple arm-arm-none-eabi -filetype asm -o - %s -frame-pointer=reserved -mattr=+aapcs-frame-chain | FileCheck %s --check-prefixes=NOFP-AAPCS,LEAF-NOFP-AAPCS9 10define dso_local noundef i32 @leaf(i32 noundef %0) {11; LEAF-FP-LABEL: leaf:12; LEAF-FP: @ %bb.0:13; LEAF-FP-NEXT: .save {r11, lr}14; LEAF-FP-NEXT: push {r11, lr}15; LEAF-FP-NEXT: .setfp r11, sp16; LEAF-FP-NEXT: mov r11, sp17; LEAF-FP-NEXT: push {r0}18; LEAF-FP-NEXT: add r0, r0, #419; LEAF-FP-NEXT: mov sp, r1120; LEAF-FP-NEXT: pop {r11, lr}21; LEAF-FP-NEXT: mov pc, lr22;23; LEAF-FP-AAPCS-LABEL: leaf:24; LEAF-FP-AAPCS: @ %bb.0:25; LEAF-FP-AAPCS-NEXT: .save {r11, lr}26; LEAF-FP-AAPCS-NEXT: push {r11, lr}27; LEAF-FP-AAPCS-NEXT: .setfp r11, sp28; LEAF-FP-AAPCS-NEXT: mov r11, sp29; LEAF-FP-AAPCS-NEXT: push {r0}30; LEAF-FP-AAPCS-NEXT: add r0, r0, #431; LEAF-FP-AAPCS-NEXT: mov sp, r1132; LEAF-FP-AAPCS-NEXT: pop {r11, lr}33; LEAF-FP-AAPCS-NEXT: mov pc, lr34;35; LEAF-NOFP-LABEL: leaf:36; LEAF-NOFP: @ %bb.0:37; LEAF-NOFP-NEXT: .pad #438; LEAF-NOFP-NEXT: sub sp, sp, #439; LEAF-NOFP-NEXT: str r0, [sp]40; LEAF-NOFP-NEXT: add r0, r0, #441; LEAF-NOFP-NEXT: add sp, sp, #442; LEAF-NOFP-NEXT: mov pc, lr43;44; LEAF-NOFP-AAPCS-LABEL: leaf:45; LEAF-NOFP-AAPCS: @ %bb.0:46; LEAF-NOFP-AAPCS-NEXT: .pad #447; LEAF-NOFP-AAPCS-NEXT: sub sp, sp, #448; LEAF-NOFP-AAPCS-NEXT: str r0, [sp]49; LEAF-NOFP-AAPCS-NEXT: add r0, r0, #450; LEAF-NOFP-AAPCS-NEXT: add sp, sp, #451; LEAF-NOFP-AAPCS-NEXT: mov pc, lr52 %2 = alloca i32, align 453 store i32 %0, ptr %2, align 454 %3 = load i32, ptr %2, align 455 %4 = add nsw i32 %3, 456 ret i32 %457}58 59define dso_local noundef i32 @non_leaf(i32 noundef %0) {60; FP-LABEL: non_leaf:61; FP: @ %bb.0:62; FP-NEXT: .save {r11, lr}63; FP-NEXT: push {r11, lr}64; FP-NEXT: .setfp r11, sp65; FP-NEXT: mov r11, sp66; FP-NEXT: .pad #867; FP-NEXT: sub sp, sp, #868; FP-NEXT: str r0, [sp, #4]69; FP-NEXT: bl leaf70; FP-NEXT: add r0, r0, #171; FP-NEXT: mov sp, r1172; FP-NEXT: pop {r11, lr}73; FP-NEXT: mov pc, lr74;75; FP-AAPCS-LABEL: non_leaf:76; FP-AAPCS: @ %bb.0:77; FP-AAPCS-NEXT: .save {r11, lr}78; FP-AAPCS-NEXT: push {r11, lr}79; FP-AAPCS-NEXT: .setfp r11, sp80; FP-AAPCS-NEXT: mov r11, sp81; FP-AAPCS-NEXT: .pad #882; FP-AAPCS-NEXT: sub sp, sp, #883; FP-AAPCS-NEXT: str r0, [sp, #4]84; FP-AAPCS-NEXT: bl leaf85; FP-AAPCS-NEXT: add r0, r0, #186; FP-AAPCS-NEXT: mov sp, r1187; FP-AAPCS-NEXT: pop {r11, lr}88; FP-AAPCS-NEXT: mov pc, lr89;90; NOFP-LABEL: non_leaf:91; NOFP: @ %bb.0:92; NOFP-NEXT: .save {r11, lr}93; NOFP-NEXT: push {r11, lr}94; NOFP-NEXT: .pad #895; NOFP-NEXT: sub sp, sp, #896; NOFP-NEXT: str r0, [sp, #4]97; NOFP-NEXT: bl leaf98; NOFP-NEXT: add r0, r0, #199; NOFP-NEXT: add sp, sp, #8100; NOFP-NEXT: pop {r11, lr}101; NOFP-NEXT: mov pc, lr102;103; NOFP-AAPCS-LABEL: non_leaf:104; NOFP-AAPCS: @ %bb.0:105; NOFP-AAPCS-NEXT: .save {r11, lr}106; NOFP-AAPCS-NEXT: push {r11, lr}107; NOFP-AAPCS-NEXT: .pad #8108; NOFP-AAPCS-NEXT: sub sp, sp, #8109; NOFP-AAPCS-NEXT: str r0, [sp, #4]110; NOFP-AAPCS-NEXT: bl leaf111; NOFP-AAPCS-NEXT: add r0, r0, #1112; NOFP-AAPCS-NEXT: add sp, sp, #8113; NOFP-AAPCS-NEXT: pop {r11, lr}114; NOFP-AAPCS-NEXT: mov pc, lr115 %2 = alloca i32, align 4116 store i32 %0, ptr %2, align 4117 %3 = load i32, ptr %2, align 4118 %4 = call noundef i32 @leaf(i32 noundef %3)119 %5 = add nsw i32 %4, 1120 ret i32 %5121}122 123declare ptr @llvm.stacksave()124define dso_local void @required_fp(i32 %0, i32 %1) {125; LEAF-FP-LABEL: required_fp:126; LEAF-FP: @ %bb.0:127; LEAF-FP-NEXT: .save {r4, r5, r11, lr}128; LEAF-FP-NEXT: push {r4, r5, r11, lr}129; LEAF-FP-NEXT: .setfp r11, sp, #8130; LEAF-FP-NEXT: add r11, sp, #8131; LEAF-FP-NEXT: .pad #24132; LEAF-FP-NEXT: sub sp, sp, #24133; LEAF-FP-NEXT: str r1, [r11, #-16]134; LEAF-FP-NEXT: mov r1, #7135; LEAF-FP-NEXT: add r1, r1, r0, lsl #2136; LEAF-FP-NEXT: str r0, [r11, #-12]137; LEAF-FP-NEXT: bic r1, r1, #7138; LEAF-FP-NEXT: str sp, [r11, #-24]139; LEAF-FP-NEXT: sub sp, sp, r1140; LEAF-FP-NEXT: mov r1, #0141; LEAF-FP-NEXT: str r0, [r11, #-32]142; LEAF-FP-NEXT: str r1, [r11, #-28]143; LEAF-FP-NEXT: sub sp, r11, #8144; LEAF-FP-NEXT: pop {r4, r5, r11, lr}145; LEAF-FP-NEXT: mov pc, lr146;147; LEAF-FP-AAPCS-LABEL: required_fp:148; LEAF-FP-AAPCS: @ %bb.0:149; LEAF-FP-AAPCS-NEXT: .save {r4, r5, r11, lr}150; LEAF-FP-AAPCS-NEXT: push {r4, r5, r11, lr}151; LEAF-FP-AAPCS-NEXT: .setfp r11, sp, #8152; LEAF-FP-AAPCS-NEXT: add r11, sp, #8153; LEAF-FP-AAPCS-NEXT: .pad #24154; LEAF-FP-AAPCS-NEXT: sub sp, sp, #24155; LEAF-FP-AAPCS-NEXT: str r1, [r11, #-16]156; LEAF-FP-AAPCS-NEXT: mov r1, #7157; LEAF-FP-AAPCS-NEXT: add r1, r1, r0, lsl #2158; LEAF-FP-AAPCS-NEXT: str r0, [r11, #-12]159; LEAF-FP-AAPCS-NEXT: bic r1, r1, #7160; LEAF-FP-AAPCS-NEXT: str sp, [r11, #-24]161; LEAF-FP-AAPCS-NEXT: sub sp, sp, r1162; LEAF-FP-AAPCS-NEXT: mov r1, #0163; LEAF-FP-AAPCS-NEXT: str r0, [r11, #-32]164; LEAF-FP-AAPCS-NEXT: str r1, [r11, #-28]165; LEAF-FP-AAPCS-NEXT: sub sp, r11, #8166; LEAF-FP-AAPCS-NEXT: pop {r4, r5, r11, lr}167; LEAF-FP-AAPCS-NEXT: mov pc, lr168;169; LEAF-NOFP-LABEL: required_fp:170; LEAF-NOFP: @ %bb.0:171; LEAF-NOFP-NEXT: .save {r4, r5, r11}172; LEAF-NOFP-NEXT: push {r4, r5, r11}173; LEAF-NOFP-NEXT: .setfp r11, sp, #8174; LEAF-NOFP-NEXT: add r11, sp, #8175; LEAF-NOFP-NEXT: .pad #20176; LEAF-NOFP-NEXT: sub sp, sp, #20177; LEAF-NOFP-NEXT: str r1, [r11, #-16]178; LEAF-NOFP-NEXT: mov r1, #7179; LEAF-NOFP-NEXT: add r1, r1, r0, lsl #2180; LEAF-NOFP-NEXT: str r0, [r11, #-12]181; LEAF-NOFP-NEXT: bic r1, r1, #7182; LEAF-NOFP-NEXT: str sp, [r11, #-20]183; LEAF-NOFP-NEXT: sub sp, sp, r1184; LEAF-NOFP-NEXT: mov r1, #0185; LEAF-NOFP-NEXT: str r0, [r11, #-28]186; LEAF-NOFP-NEXT: str r1, [r11, #-24]187; LEAF-NOFP-NEXT: sub sp, r11, #8188; LEAF-NOFP-NEXT: pop {r4, r5, r11}189; LEAF-NOFP-NEXT: mov pc, lr190;191; LEAF-NOFP-AAPCS-LABEL: required_fp:192; LEAF-NOFP-AAPCS: @ %bb.0:193; LEAF-NOFP-AAPCS-NEXT: .save {r4, r5, r11, lr}194; LEAF-NOFP-AAPCS-NEXT: push {r4, r5, r11, lr}195; LEAF-NOFP-AAPCS-NEXT: .setfp r11, sp, #8196; LEAF-NOFP-AAPCS-NEXT: add r11, sp, #8197; LEAF-NOFP-AAPCS-NEXT: .pad #24198; LEAF-NOFP-AAPCS-NEXT: sub sp, sp, #24199; LEAF-NOFP-AAPCS-NEXT: str r1, [r11, #-16]200; LEAF-NOFP-AAPCS-NEXT: mov r1, #7201; LEAF-NOFP-AAPCS-NEXT: add r1, r1, r0, lsl #2202; LEAF-NOFP-AAPCS-NEXT: str r0, [r11, #-12]203; LEAF-NOFP-AAPCS-NEXT: bic r1, r1, #7204; LEAF-NOFP-AAPCS-NEXT: str sp, [r11, #-24]205; LEAF-NOFP-AAPCS-NEXT: sub sp, sp, r1206; LEAF-NOFP-AAPCS-NEXT: mov r1, #0207; LEAF-NOFP-AAPCS-NEXT: str r0, [r11, #-32]208; LEAF-NOFP-AAPCS-NEXT: str r1, [r11, #-28]209; LEAF-NOFP-AAPCS-NEXT: sub sp, r11, #8210; LEAF-NOFP-AAPCS-NEXT: pop {r4, r5, r11, lr}211; LEAF-NOFP-AAPCS-NEXT: mov pc, lr212 %3 = alloca i32, align 4213 %4 = alloca i32, align 4214 %5 = alloca ptr, align 8215 %6 = alloca i64, align 8216 store i32 %0, ptr %3, align 4217 store i32 %1, ptr %4, align 4218 %7 = load i32, ptr %3, align 4219 %8 = zext i32 %7 to i64220 %9 = call ptr @llvm.stacksave()221 store ptr %9, ptr %5, align 8222 %10 = alloca i32, i64 %8, align 4223 store i64 %8, ptr %6, align 8224 ret void225}226 227define dso_local noundef i32 @leaf_tailcall(i32 noundef %0) {228; LEAF-FP-LABEL: leaf_tailcall:229; LEAF-FP: @ %bb.0:230; LEAF-FP-NEXT: .save {r11, lr}231; LEAF-FP-NEXT: push {r11, lr}232; LEAF-FP-NEXT: .setfp r11, sp233; LEAF-FP-NEXT: mov r11, sp234; LEAF-FP-NEXT: pop {r11, lr}235; LEAF-FP-NEXT: b leaf236;237; LEAF-FP-AAPCS-LABEL: leaf_tailcall:238; LEAF-FP-AAPCS: @ %bb.0:239; LEAF-FP-AAPCS-NEXT: .save {r11, lr}240; LEAF-FP-AAPCS-NEXT: push {r11, lr}241; LEAF-FP-AAPCS-NEXT: .setfp r11, sp242; LEAF-FP-AAPCS-NEXT: mov r11, sp243; LEAF-FP-AAPCS-NEXT: pop {r11, lr}244; LEAF-FP-AAPCS-NEXT: b leaf245;246; LEAF-NOFP-LABEL: leaf_tailcall:247; LEAF-NOFP: @ %bb.0:248; LEAF-NOFP-NEXT: b leaf249;250; LEAF-NOFP-AAPCS-LABEL: leaf_tailcall:251; LEAF-NOFP-AAPCS: @ %bb.0:252; LEAF-NOFP-AAPCS-NEXT: b leaf253 %a = tail call noundef i32 @leaf(i32 noundef %0)254 ret i32 %a255}256