287 lines · plain
1; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL2; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf | FileCheck %s3; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf -tailcallopt -aarch64-redzone | FileCheck %s -check-prefix CHECK-TAIL-RZ4 5; Without tailcallopt fastcc still means the caller cleans up the6; stack, so try to make sure this is respected.7 8define fastcc void @func_stack0() uwtable {9; CHECK-LABEL: func_stack0:10; CHECK: sub sp, sp, #4811; CHECK: add x29, sp, #3212; CHECK: str w{{[0-9]+}}, [sp]13 14; CHECK-TAIL-LABEL: func_stack0:15; CHECK-TAIL: sub sp, sp, #4816; CHECK-TAIL-NEXT: .cfi_def_cfa_offset 4817; CHECK-TAIL-NEXT: stp x29, x30, [sp, #32]18; CHECK-TAIL-NEXT: add x29, sp, #3219; CHECK-TAIL: str w{{[0-9]+}}, [sp]20 21 22 call fastcc void @func_stack8([8 x i64] undef, i32 42)23; CHECK: bl func_stack824; CHECK-NOT: sub sp, sp,25; CHECK-NOT: [sp, #{{[-0-9]+}}]!26; CHECK-NOT: [sp], #{{[-0-9]+}}27 28; CHECK-TAIL: bl func_stack829; CHECK-TAIL: stp xzr, xzr, [sp, #-16]!30 31 32 call fastcc void @func_stack32([8 x i64] undef, i128 0, i128 9)33; CHECK: bl func_stack3234; CHECK-NOT: sub sp, sp,35 36 37; CHECK-TAIL: bl func_stack3238; CHECK-TAIL: sub sp, sp, #3239 40 41 call fastcc void @func_stack0()42; CHECK: bl func_stack043; CHECK-NOT: sub sp, sp44 45 46; CHECK-TAIL: bl func_stack047; CHECK-TAIL-NOT: sub sp, sp48 49 ret void50; CHECK: ldp x29, x30, [sp, #32]51; CHECK-NEXT: add sp, sp, #4852; CHECK-NEXT: .cfi_def_cfa_offset 053; CHECK-NEXT: .cfi_restore w3054; CHECK-NEXT: .cfi_restore w2955; CHECK-NEXT: ret56 57 58; CHECK-TAIL: ldp x29, x30, [sp, #32]59; CHECK-TAIL-NEXT: add sp, sp, #4860; CHECK-TAIL-NEXT: .cfi_def_cfa_offset 061; CHECK-TAIL-NEXT: .cfi_restore w3062; CHECK-TAIL-NEXT: .cfi_restore w2963; CHECK-TAIL-NEXT: ret64}65 66define fastcc void @func_stack8([8 x i64], i32 %stacked) uwtable {67; CHECK-LABEL: func_stack8:68; CHECK: sub sp, sp, #4869; CHECK: stp x29, x30, [sp, #32]70; CHECK: add x29, sp, #3271; CHECK: str w{{[0-9]+}}, [sp]72 73 74; CHECK-TAIL-LABEL: func_stack8:75; CHECK-TAIL: sub sp, sp, #4876; CHECK-TAIL: stp x29, x30, [sp, #32]77; CHECK-TAIL: add x29, sp, #3278; CHECK-TAIL: str w{{[0-9]+}}, [sp]79 80 81 call fastcc void @func_stack8([8 x i64] undef, i32 42)82; CHECK: bl func_stack883; CHECK-NOT: sub sp, sp,84; CHECK-NOT: [sp, #{{[-0-9]+}}]!85; CHECK-NOT: [sp], #{{[-0-9]+}}86 87 88; CHECK-TAIL: bl func_stack889; CHECK-TAIL: stp xzr, xzr, [sp, #-16]!90 91 92 call fastcc void @func_stack32([8 x i64] undef, i128 0, i128 9)93; CHECK: bl func_stack3294; CHECK-NOT: sub sp, sp,95 96 97; CHECK-TAIL: bl func_stack3298; CHECK-TAIL: sub sp, sp, #3299 100 101 call fastcc void @func_stack0()102; CHECK: bl func_stack0103; CHECK-NOT: sub sp, sp104 105; CHECK-TAIL: bl func_stack0106; CHECK-TAIL-NOT: sub sp, sp107 108 ret void109; CHECK-NEXT: .cfi_def_cfa wsp, 48110; CHECK-NEXT: ldp x29, x30, [sp, #32]111; CHECK-NEXT: add sp, sp, #48112; CHECK-NEXT: .cfi_def_cfa_offset 0113; CHECK-NEXT: .cfi_restore w30114; CHECK-NEXT: .cfi_restore w29115; CHECK-NEXT: ret116 117 118; CHECK-TAIL: ldp x29, x30, [sp, #32]119; CHECK-TAIL-NEXT: add sp, sp, #64120; CHECK-TAIL-NEXT: .cfi_def_cfa_offset -16121; CHECK-TAIL-NEXT: .cfi_restore w30122; CHECK-TAIL-NEXT: .cfi_restore w29123; CHECK-TAIL-NEXT: ret124}125 126define fastcc void @func_stack32([8 x i64], i128 %stacked0, i128 %stacked1) uwtable {127; CHECK-LABEL: func_stack32:128; CHECK: add x29, sp, #32129 130; CHECK-TAIL-LABEL: func_stack32:131; CHECK-TAIL: add x29, sp, #32132 133 134 call fastcc void @func_stack8([8 x i64] undef, i32 42)135; CHECK: bl func_stack8136; CHECK-NOT: sub sp, sp,137; CHECK-NOT: [sp, #{{[-0-9]+}}]!138; CHECK-NOT: [sp], #{{[-0-9]+}}139 140; CHECK-TAIL: bl func_stack8141; CHECK-TAIL: stp xzr, xzr, [sp, #-16]!142 143 144 call fastcc void @func_stack32([8 x i64] undef, i128 0, i128 9)145; CHECK: bl func_stack32146; CHECK-NOT: sub sp, sp,147 148 149; CHECK-TAIL: bl func_stack32150; CHECK-TAIL: sub sp, sp, #32151 152 153 call fastcc void @func_stack0()154; CHECK: bl func_stack0155; CHECK-NOT: sub sp, sp156 157 158; CHECK-TAIL: bl func_stack0159; CHECK-TAIL-NOT: sub sp, sp160 161 ret void162; CHECK: .cfi_def_cfa wsp, 48163; CHECK-NEXT: ldp x29, x30, [sp, #32]164; CHECK-NEXT: add sp, sp, #48165; CHECK-NEXT: .cfi_def_cfa_offset 0166; CHECK-NEXT: .cfi_restore w30167; CHECK-NEXT: .cfi_restore w29168; CHECK-NEXT: ret169 170; CHECK-TAIL: ldp x29, x30, [sp, #32]171; CHECK-TAIL-NEXT: add sp, sp, #80172; CHECK-TAIL-NEXT: .cfi_def_cfa_offset -32173; CHECK-TAIL-NEXT: .cfi_restore w30174; CHECK-TAIL-NEXT: .cfi_restore w29175; CHECK-TAIL-NEXT: ret176}177 178; Check that arg stack pop is done after callee-save restore when no frame pointer is used.179define fastcc void @func_stack32_leaf([8 x i64], i128 %stacked0, i128 %stacked1) uwtable {180; CHECK-LABEL: func_stack32_leaf:181; CHECK: str x20, [sp, #-16]!182; CHECK: nop183; CHECK-NEXT: //NO_APP184; CHECK-NEXT: ldr x20, [sp], #16185; CHECK-NEXT: .cfi_def_cfa_offset 0186; CHECK-NEXT: .cfi_restore w20187; CHECK-NEXT: ret188 189; CHECK-TAIL-LABEL: func_stack32_leaf:190; CHECK-TAIL: str x20, [sp, #-16]!191; CHECK-TAIL: nop192; CHECK-TAIL-NEXT: //NO_APP193; CHECK-TAIL-NEXT: ldr x20, [sp], #16194; CHECK-TAIL-NEXT: .cfi_def_cfa_offset 0195; CHECK-TAIL-NEXT: add sp, sp, #32196; CHECK-TAIL-NEXT: .cfi_def_cfa_offset -32197; CHECK-TAIL-NEXT: .cfi_restore w20198; CHECK-TAIL-NEXT: ret199 200; CHECK-TAIL-RZ-LABEL: func_stack32_leaf:201; CHECK-TAIL-RZ: str x20, [sp, #-16]!202; CHECK-TAIL-RZ-NOT: sub sp, sp203; CHECK-TAIL-RZ: nop204; CHECK-TAIL-RZ-NEXT: //NO_APP205; CHECK-TAIL-RZ-NEXT: ldr x20, [sp], #16206; CHECK-TAIL-RZ-NEXT: .cfi_def_cfa_offset 0207; CHECK-TAIL-RZ-NEXT: add sp, sp, #32208; CHECK-TAIL-RZ-NEXT: .cfi_def_cfa_offset -32209; CHECK-TAIL-RZ-NEXT: .cfi_restore w20210; CHECK-TAIL-RZ-NEXT: ret211 212 ; Make sure there is a callee-save register to save/restore.213 call void asm sideeffect "nop", "~{x20}"() nounwind214 ret void215}216 217; Check that arg stack pop is done after callee-save restore when no frame pointer is used.218define fastcc void @func_stack32_leaf_local([8 x i64], i128 %stacked0, i128 %stacked1) uwtable {219; CHECK-LABEL: func_stack32_leaf_local:220; CHECK: sub sp, sp, #32221; CHECK-NEXT: .cfi_def_cfa_offset 32222; CHECK-NEXT: str x20, [sp, #16]223; CHECK: nop224; CHECK-NEXT: //NO_APP225; CHECK-NEXT: ldr x20, [sp, #16]226; CHECK-NEXT: add sp, sp, #32227; CHECK-NEXT: .cfi_def_cfa_offset 0228; CHECK-NEXT: .cfi_restore w20229; CHECK-NEXT: ret230 231; CHECK-TAIL-LABEL: func_stack32_leaf_local:232; CHECK-TAIL: sub sp, sp, #32233; CHECK-TAIL-NEXT: .cfi_def_cfa_offset 32234; CHECK-TAIL-NEXT: str x20, [sp, #16]235; CHECK-TAIL: nop236; CHECK-TAIL-NEXT: //NO_APP237; CHECK-TAIL-NEXT: ldr x20, [sp, #16]238; CHECK-TAIL-NEXT: add sp, sp, #64239; CHECK-TAIL-NEXT: .cfi_def_cfa_offset -32240; CHECK-TAIL-NEXT: .cfi_restore w20241; CHECK-TAIL-NEXT: ret242 243; CHECK-TAIL-RZ-LABEL: func_stack32_leaf_local:244; CHECK-TAIL-RZ: str x20, [sp, #-16]!245; CHECK-TAIL-RZ-NOT: sub sp, sp246; CHECK-TAIL-RZ: nop247; CHECK-TAIL-RZ-NEXT: //NO_APP248; CHECK-TAIL-RZ-NEXT: ldr x20, [sp], #16249; CHECK-TAIL-RZ-NEXT: .cfi_def_cfa_offset 0250; CHECK-TAIL-RZ-NEXT: add sp, sp, #32251; CHECK-TAIL-RZ-NEXT: .cfi_def_cfa_offset -32252; CHECK-TAIL-RZ-NEXT: .cfi_restore w20253; CHECK-TAIL-RZ-NEXT: ret254 255 %val0 = alloca [2 x i64], align 8256 257 ; Make sure there is a callee-save register to save/restore.258 call void asm sideeffect "nop", "~{x20}"() nounwind259 ret void260}261 262; Check that arg stack pop is done after callee-save restore when no frame pointer is used.263define fastcc void @func_stack32_leaf_local_nocs([8 x i64], i128 %stacked0, i128 %stacked1) uwtable {264; CHECK-LABEL: func_stack32_leaf_local_nocs:265; CHECK: sub sp, sp, #16266; CHECK-NEXT: .cfi_def_cfa_offset 16267; CHECK-NEXT: add sp, sp, #16268; CHECK-NEXT: .cfi_def_cfa_offset 0269; CHECK-NEXT: ret270 271; CHECK-TAIL-LABEL: func_stack32_leaf_local_nocs:272; CHECK-TAIL: sub sp, sp, #16273; CHECK-TAIL-NEXT: .cfi_def_cfa_offset 16274; CHECK-TAIL-NEXT: add sp, sp, #48275; CHECK-TAIL-NEXT: .cfi_def_cfa_offset -32276; CHECK-TAIL-NEXT: ret277 278; CHECK-TAIL-RZ-LABEL: func_stack32_leaf_local_nocs:279; CHECK-TAIL-RZ: add sp, sp, #32280; CHECK-TAIL-RZ-NEXT: .cfi_def_cfa_offset -32281; CHECK-TAIL-RZ-NEXT: ret282 283 %val0 = alloca [2 x i64], align 8284 285 ret void286}287