brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · d07f4a1 Raw
198 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s3 4; Check that a tail call from an SVE function to another SVE function5; can use a tail-call, as the same registers will be preserved by the6; callee.7define <vscale x 4 x i32> @sve_caller_sve_callee() nounwind {8; CHECK-LABEL: sve_caller_sve_callee:9; CHECK:       // %bb.0:10; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill11; CHECK-NEXT:    addvl sp, sp, #-212; CHECK-NEXT:    str z10, [sp] // 16-byte Folded Spill13; CHECK-NEXT:    str z9, [sp, #1, mul vl] // 16-byte Folded Spill14; CHECK-NEXT:    //APP15; CHECK-NEXT:    //NO_APP16; CHECK-NEXT:    ldr z10, [sp] // 16-byte Folded Reload17; CHECK-NEXT:    ldr z9, [sp, #1, mul vl] // 16-byte Folded Reload18; CHECK-NEXT:    addvl sp, sp, #219; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload20; CHECK-NEXT:    b sve_callee21  tail call void asm sideeffect "", "~{z9},~{z10}"()22  %call = tail call <vscale x 4 x i32> @sve_callee()23  ret <vscale x 4 x i32> %call24}25 26define <vscale x 4 x i32> @sve_caller_sve_callee_fastcc() nounwind {27; CHECK-LABEL: sve_caller_sve_callee_fastcc:28; CHECK:       // %bb.0:29; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill30; CHECK-NEXT:    addvl sp, sp, #-231; CHECK-NEXT:    str z10, [sp] // 16-byte Folded Spill32; CHECK-NEXT:    str z9, [sp, #1, mul vl] // 16-byte Folded Spill33; CHECK-NEXT:    //APP34; CHECK-NEXT:    //NO_APP35; CHECK-NEXT:    ldr z10, [sp] // 16-byte Folded Reload36; CHECK-NEXT:    ldr z9, [sp, #1, mul vl] // 16-byte Folded Reload37; CHECK-NEXT:    addvl sp, sp, #238; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload39; CHECK-NEXT:    b sve_callee40  tail call void asm sideeffect "", "~{z9},~{z10}"()41  %call = tail call fastcc <vscale x 4 x i32> @sve_callee()42  ret <vscale x 4 x i32> %call43}44 45declare <vscale x 4 x i32> @sve_callee()46 47; Check that a tail call from an SVE function to a non-SVE function48; does not use a tail-call, because after the call many of the SVE49; registers may be clobbered and needs to be restored.50define i32 @sve_caller_non_sve_callee(<vscale x 4 x i32> %arg) nounwind {51; CHECK-LABEL: sve_caller_non_sve_callee:52; CHECK:       // %bb.0:53; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill54; CHECK-NEXT:    addvl sp, sp, #-1855; CHECK-NEXT:    str p15, [sp, #4, mul vl] // 2-byte Spill56; CHECK-NEXT:    str p14, [sp, #5, mul vl] // 2-byte Spill57; CHECK-NEXT:    str p13, [sp, #6, mul vl] // 2-byte Spill58; CHECK-NEXT:    str p12, [sp, #7, mul vl] // 2-byte Spill59; CHECK-NEXT:    str p11, [sp, #8, mul vl] // 2-byte Spill60; CHECK-NEXT:    str p10, [sp, #9, mul vl] // 2-byte Spill61; CHECK-NEXT:    str p9, [sp, #10, mul vl] // 2-byte Spill62; CHECK-NEXT:    str p8, [sp, #11, mul vl] // 2-byte Spill63; CHECK-NEXT:    str p7, [sp, #12, mul vl] // 2-byte Spill64; CHECK-NEXT:    str p6, [sp, #13, mul vl] // 2-byte Spill65; CHECK-NEXT:    str p5, [sp, #14, mul vl] // 2-byte Spill66; CHECK-NEXT:    str p4, [sp, #15, mul vl] // 2-byte Spill67; CHECK-NEXT:    str z23, [sp, #2, mul vl] // 16-byte Folded Spill68; CHECK-NEXT:    str z22, [sp, #3, mul vl] // 16-byte Folded Spill69; CHECK-NEXT:    str z21, [sp, #4, mul vl] // 16-byte Folded Spill70; CHECK-NEXT:    str z20, [sp, #5, mul vl] // 16-byte Folded Spill71; CHECK-NEXT:    str z19, [sp, #6, mul vl] // 16-byte Folded Spill72; CHECK-NEXT:    str z18, [sp, #7, mul vl] // 16-byte Folded Spill73; CHECK-NEXT:    str z17, [sp, #8, mul vl] // 16-byte Folded Spill74; CHECK-NEXT:    str z16, [sp, #9, mul vl] // 16-byte Folded Spill75; CHECK-NEXT:    str z15, [sp, #10, mul vl] // 16-byte Folded Spill76; CHECK-NEXT:    str z14, [sp, #11, mul vl] // 16-byte Folded Spill77; CHECK-NEXT:    str z13, [sp, #12, mul vl] // 16-byte Folded Spill78; CHECK-NEXT:    str z12, [sp, #13, mul vl] // 16-byte Folded Spill79; CHECK-NEXT:    str z11, [sp, #14, mul vl] // 16-byte Folded Spill80; CHECK-NEXT:    str z10, [sp, #15, mul vl] // 16-byte Folded Spill81; CHECK-NEXT:    str z9, [sp, #16, mul vl] // 16-byte Folded Spill82; CHECK-NEXT:    str z8, [sp, #17, mul vl] // 16-byte Folded Spill83; CHECK-NEXT:    //APP84; CHECK-NEXT:    //NO_APP85; CHECK-NEXT:    bl non_sve_callee86; CHECK-NEXT:    ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload87; CHECK-NEXT:    ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload88; CHECK-NEXT:    ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload89; CHECK-NEXT:    ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload90; CHECK-NEXT:    ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload91; CHECK-NEXT:    ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload92; CHECK-NEXT:    ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload93; CHECK-NEXT:    ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload94; CHECK-NEXT:    ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload95; CHECK-NEXT:    ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload96; CHECK-NEXT:    ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload97; CHECK-NEXT:    ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload98; CHECK-NEXT:    ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload99; CHECK-NEXT:    ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload100; CHECK-NEXT:    ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload101; CHECK-NEXT:    ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload102; CHECK-NEXT:    ldr p15, [sp, #4, mul vl] // 2-byte Reload103; CHECK-NEXT:    ldr p14, [sp, #5, mul vl] // 2-byte Reload104; CHECK-NEXT:    ldr p13, [sp, #6, mul vl] // 2-byte Reload105; CHECK-NEXT:    ldr p12, [sp, #7, mul vl] // 2-byte Reload106; CHECK-NEXT:    ldr p11, [sp, #8, mul vl] // 2-byte Reload107; CHECK-NEXT:    ldr p10, [sp, #9, mul vl] // 2-byte Reload108; CHECK-NEXT:    ldr p9, [sp, #10, mul vl] // 2-byte Reload109; CHECK-NEXT:    ldr p8, [sp, #11, mul vl] // 2-byte Reload110; CHECK-NEXT:    ldr p7, [sp, #12, mul vl] // 2-byte Reload111; CHECK-NEXT:    ldr p6, [sp, #13, mul vl] // 2-byte Reload112; CHECK-NEXT:    ldr p5, [sp, #14, mul vl] // 2-byte Reload113; CHECK-NEXT:    ldr p4, [sp, #15, mul vl] // 2-byte Reload114; CHECK-NEXT:    addvl sp, sp, #18115; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload116; CHECK-NEXT:    ret117  tail call void asm sideeffect "", "~{z9},~{z10}"()118  %call = tail call i32 @non_sve_callee()119  ret i32 %call120}121 122; Check that a tail call from an SVE function to a non-SVE function123; does not use a tail-call, because after the call many of the SVE124; registers may be clobbered and needs to be restored.125define i32 @sve_caller_non_sve_callee_fastcc(<vscale x 4 x i32> %arg) nounwind {126; CHECK-LABEL: sve_caller_non_sve_callee_fastcc:127; CHECK:       // %bb.0:128; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill129; CHECK-NEXT:    addvl sp, sp, #-18130; CHECK-NEXT:    str p15, [sp, #4, mul vl] // 2-byte Spill131; CHECK-NEXT:    str p14, [sp, #5, mul vl] // 2-byte Spill132; CHECK-NEXT:    str p13, [sp, #6, mul vl] // 2-byte Spill133; CHECK-NEXT:    str p12, [sp, #7, mul vl] // 2-byte Spill134; CHECK-NEXT:    str p11, [sp, #8, mul vl] // 2-byte Spill135; CHECK-NEXT:    str p10, [sp, #9, mul vl] // 2-byte Spill136; CHECK-NEXT:    str p9, [sp, #10, mul vl] // 2-byte Spill137; CHECK-NEXT:    str p8, [sp, #11, mul vl] // 2-byte Spill138; CHECK-NEXT:    str p7, [sp, #12, mul vl] // 2-byte Spill139; CHECK-NEXT:    str p6, [sp, #13, mul vl] // 2-byte Spill140; CHECK-NEXT:    str p5, [sp, #14, mul vl] // 2-byte Spill141; CHECK-NEXT:    str p4, [sp, #15, mul vl] // 2-byte Spill142; CHECK-NEXT:    str z23, [sp, #2, mul vl] // 16-byte Folded Spill143; CHECK-NEXT:    str z22, [sp, #3, mul vl] // 16-byte Folded Spill144; CHECK-NEXT:    str z21, [sp, #4, mul vl] // 16-byte Folded Spill145; CHECK-NEXT:    str z20, [sp, #5, mul vl] // 16-byte Folded Spill146; CHECK-NEXT:    str z19, [sp, #6, mul vl] // 16-byte Folded Spill147; CHECK-NEXT:    str z18, [sp, #7, mul vl] // 16-byte Folded Spill148; CHECK-NEXT:    str z17, [sp, #8, mul vl] // 16-byte Folded Spill149; CHECK-NEXT:    str z16, [sp, #9, mul vl] // 16-byte Folded Spill150; CHECK-NEXT:    str z15, [sp, #10, mul vl] // 16-byte Folded Spill151; CHECK-NEXT:    str z14, [sp, #11, mul vl] // 16-byte Folded Spill152; CHECK-NEXT:    str z13, [sp, #12, mul vl] // 16-byte Folded Spill153; CHECK-NEXT:    str z12, [sp, #13, mul vl] // 16-byte Folded Spill154; CHECK-NEXT:    str z11, [sp, #14, mul vl] // 16-byte Folded Spill155; CHECK-NEXT:    str z10, [sp, #15, mul vl] // 16-byte Folded Spill156; CHECK-NEXT:    str z9, [sp, #16, mul vl] // 16-byte Folded Spill157; CHECK-NEXT:    str z8, [sp, #17, mul vl] // 16-byte Folded Spill158; CHECK-NEXT:    //APP159; CHECK-NEXT:    //NO_APP160; CHECK-NEXT:    bl non_sve_callee161; CHECK-NEXT:    ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload162; CHECK-NEXT:    ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload163; CHECK-NEXT:    ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload164; CHECK-NEXT:    ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload165; CHECK-NEXT:    ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload166; CHECK-NEXT:    ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload167; CHECK-NEXT:    ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload168; CHECK-NEXT:    ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload169; CHECK-NEXT:    ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload170; CHECK-NEXT:    ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload171; CHECK-NEXT:    ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload172; CHECK-NEXT:    ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload173; CHECK-NEXT:    ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload174; CHECK-NEXT:    ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload175; CHECK-NEXT:    ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload176; CHECK-NEXT:    ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload177; CHECK-NEXT:    ldr p15, [sp, #4, mul vl] // 2-byte Reload178; CHECK-NEXT:    ldr p14, [sp, #5, mul vl] // 2-byte Reload179; CHECK-NEXT:    ldr p13, [sp, #6, mul vl] // 2-byte Reload180; CHECK-NEXT:    ldr p12, [sp, #7, mul vl] // 2-byte Reload181; CHECK-NEXT:    ldr p11, [sp, #8, mul vl] // 2-byte Reload182; CHECK-NEXT:    ldr p10, [sp, #9, mul vl] // 2-byte Reload183; CHECK-NEXT:    ldr p9, [sp, #10, mul vl] // 2-byte Reload184; CHECK-NEXT:    ldr p8, [sp, #11, mul vl] // 2-byte Reload185; CHECK-NEXT:    ldr p7, [sp, #12, mul vl] // 2-byte Reload186; CHECK-NEXT:    ldr p6, [sp, #13, mul vl] // 2-byte Reload187; CHECK-NEXT:    ldr p5, [sp, #14, mul vl] // 2-byte Reload188; CHECK-NEXT:    ldr p4, [sp, #15, mul vl] // 2-byte Reload189; CHECK-NEXT:    addvl sp, sp, #18190; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload191; CHECK-NEXT:    ret192  tail call void asm sideeffect "", "~{z9},~{z10}"()193  %call = tail call fastcc i32 @non_sve_callee()194  ret i32 %call195}196 197declare i32 @non_sve_callee()198