brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · a680f2f Raw
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