1225 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -frame-pointer=non-leaf -verify-machineinstrs < %s | FileCheck %s --check-prefix=FP-CHECK4; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -frame-pointer=non-leaf -verify-machineinstrs < %s | FileCheck %s --check-prefix=NO-SVE-CHECK5; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -verify-machineinstrs -enable-machine-outliner < %s | FileCheck %s --check-prefix=OUTLINER-CHECK6 7declare void @callee();8declare void @fixed_callee(<4 x i32>);9declare void @scalable_callee(<vscale x 2 x i64>);10 11declare void @streaming_callee() #0;12declare void @streaming_callee_with_arg(i32) #0;13 14; Simple example of a function with one call requiring a streaming mode change15;16define void @vg_unwind_simple() #0 {17; CHECK-LABEL: vg_unwind_simple:18; CHECK: // %bb.0:19; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill20; CHECK-NEXT: .cfi_def_cfa_offset 9621; CHECK-NEXT: cntd x922; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill23; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill24; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill25; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill26; CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill27; CHECK-NEXT: .cfi_offset vg, -1628; CHECK-NEXT: .cfi_offset w30, -2429; CHECK-NEXT: .cfi_offset w29, -3230; CHECK-NEXT: .cfi_offset b8, -4031; CHECK-NEXT: .cfi_offset b9, -4832; CHECK-NEXT: .cfi_offset b10, -5633; CHECK-NEXT: .cfi_offset b11, -6434; CHECK-NEXT: .cfi_offset b12, -7235; CHECK-NEXT: .cfi_offset b13, -8036; CHECK-NEXT: .cfi_offset b14, -8837; CHECK-NEXT: .cfi_offset b15, -9638; CHECK-NEXT: smstop sm39; CHECK-NEXT: bl callee40; CHECK-NEXT: smstart sm41; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload42; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload43; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload44; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload45; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload46; CHECK-NEXT: .cfi_def_cfa_offset 047; CHECK-NEXT: .cfi_restore vg48; CHECK-NEXT: .cfi_restore w3049; CHECK-NEXT: .cfi_restore w2950; CHECK-NEXT: .cfi_restore b851; CHECK-NEXT: .cfi_restore b952; CHECK-NEXT: .cfi_restore b1053; CHECK-NEXT: .cfi_restore b1154; CHECK-NEXT: .cfi_restore b1255; CHECK-NEXT: .cfi_restore b1356; CHECK-NEXT: .cfi_restore b1457; CHECK-NEXT: .cfi_restore b1558; CHECK-NEXT: ret59;60; FP-CHECK-LABEL: vg_unwind_simple:61; FP-CHECK: // %bb.0:62; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill63; FP-CHECK-NEXT: .cfi_def_cfa_offset 9664; FP-CHECK-NEXT: cntd x965; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill66; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill67; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill68; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill69; FP-CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill70; FP-CHECK-NEXT: add x29, sp, #6471; FP-CHECK-NEXT: .cfi_def_cfa w29, 3272; FP-CHECK-NEXT: .cfi_offset vg, -1673; FP-CHECK-NEXT: .cfi_offset w30, -2474; FP-CHECK-NEXT: .cfi_offset w29, -3275; FP-CHECK-NEXT: .cfi_offset b8, -4076; FP-CHECK-NEXT: .cfi_offset b9, -4877; FP-CHECK-NEXT: .cfi_offset b10, -5678; FP-CHECK-NEXT: .cfi_offset b11, -6479; FP-CHECK-NEXT: .cfi_offset b12, -7280; FP-CHECK-NEXT: .cfi_offset b13, -8081; FP-CHECK-NEXT: .cfi_offset b14, -8882; FP-CHECK-NEXT: .cfi_offset b15, -9683; FP-CHECK-NEXT: smstop sm84; FP-CHECK-NEXT: bl callee85; FP-CHECK-NEXT: smstart sm86; FP-CHECK-NEXT: .cfi_def_cfa wsp, 9687; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload88; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload89; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload90; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload91; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload92; FP-CHECK-NEXT: .cfi_def_cfa_offset 093; FP-CHECK-NEXT: .cfi_restore vg94; FP-CHECK-NEXT: .cfi_restore w3095; FP-CHECK-NEXT: .cfi_restore w2996; FP-CHECK-NEXT: .cfi_restore b897; FP-CHECK-NEXT: .cfi_restore b998; FP-CHECK-NEXT: .cfi_restore b1099; FP-CHECK-NEXT: .cfi_restore b11100; FP-CHECK-NEXT: .cfi_restore b12101; FP-CHECK-NEXT: .cfi_restore b13102; FP-CHECK-NEXT: .cfi_restore b14103; FP-CHECK-NEXT: .cfi_restore b15104; FP-CHECK-NEXT: ret105;106; OUTLINER-CHECK-LABEL: vg_unwind_simple:107; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_108 call void @callee();109 ret void;110}111 112; As above, with an extra register clobbered by the inline asm call which113; changes NeedsGapToAlignStack to false114;115define void @vg_unwind_needs_gap() #0 {116; CHECK-LABEL: vg_unwind_needs_gap:117; CHECK: // %bb.0:118; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill119; CHECK-NEXT: .cfi_def_cfa_offset 96120; CHECK-NEXT: cntd x9121; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill122; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill123; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill124; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill125; CHECK-NEXT: stp x9, x20, [sp, #80] // 16-byte Folded Spill126; CHECK-NEXT: .cfi_offset w20, -8127; CHECK-NEXT: .cfi_offset vg, -16128; CHECK-NEXT: .cfi_offset w30, -24129; CHECK-NEXT: .cfi_offset w29, -32130; CHECK-NEXT: .cfi_offset b8, -40131; CHECK-NEXT: .cfi_offset b9, -48132; CHECK-NEXT: .cfi_offset b10, -56133; CHECK-NEXT: .cfi_offset b11, -64134; CHECK-NEXT: .cfi_offset b12, -72135; CHECK-NEXT: .cfi_offset b13, -80136; CHECK-NEXT: .cfi_offset b14, -88137; CHECK-NEXT: .cfi_offset b15, -96138; CHECK-NEXT: //APP139; CHECK-NEXT: //NO_APP140; CHECK-NEXT: smstop sm141; CHECK-NEXT: bl callee142; CHECK-NEXT: smstart sm143; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload144; CHECK-NEXT: ldr x20, [sp, #88] // 8-byte Reload145; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload146; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload147; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload148; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload149; CHECK-NEXT: .cfi_def_cfa_offset 0150; CHECK-NEXT: .cfi_restore w20151; CHECK-NEXT: .cfi_restore vg152; CHECK-NEXT: .cfi_restore w30153; CHECK-NEXT: .cfi_restore w29154; CHECK-NEXT: .cfi_restore b8155; CHECK-NEXT: .cfi_restore b9156; CHECK-NEXT: .cfi_restore b10157; CHECK-NEXT: .cfi_restore b11158; CHECK-NEXT: .cfi_restore b12159; CHECK-NEXT: .cfi_restore b13160; CHECK-NEXT: .cfi_restore b14161; CHECK-NEXT: .cfi_restore b15162; CHECK-NEXT: ret163;164; FP-CHECK-LABEL: vg_unwind_needs_gap:165; FP-CHECK: // %bb.0:166; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill167; FP-CHECK-NEXT: .cfi_def_cfa_offset 96168; FP-CHECK-NEXT: cntd x9169; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill170; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill171; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill172; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill173; FP-CHECK-NEXT: stp x9, x20, [sp, #80] // 16-byte Folded Spill174; FP-CHECK-NEXT: add x29, sp, #64175; FP-CHECK-NEXT: .cfi_def_cfa w29, 32176; FP-CHECK-NEXT: .cfi_offset w20, -8177; FP-CHECK-NEXT: .cfi_offset vg, -16178; FP-CHECK-NEXT: .cfi_offset w30, -24179; FP-CHECK-NEXT: .cfi_offset w29, -32180; FP-CHECK-NEXT: .cfi_offset b8, -40181; FP-CHECK-NEXT: .cfi_offset b9, -48182; FP-CHECK-NEXT: .cfi_offset b10, -56183; FP-CHECK-NEXT: .cfi_offset b11, -64184; FP-CHECK-NEXT: .cfi_offset b12, -72185; FP-CHECK-NEXT: .cfi_offset b13, -80186; FP-CHECK-NEXT: .cfi_offset b14, -88187; FP-CHECK-NEXT: .cfi_offset b15, -96188; FP-CHECK-NEXT: //APP189; FP-CHECK-NEXT: //NO_APP190; FP-CHECK-NEXT: smstop sm191; FP-CHECK-NEXT: bl callee192; FP-CHECK-NEXT: smstart sm193; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96194; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload195; FP-CHECK-NEXT: ldr x20, [sp, #88] // 8-byte Reload196; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload197; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload198; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload199; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload200; FP-CHECK-NEXT: .cfi_def_cfa_offset 0201; FP-CHECK-NEXT: .cfi_restore w20202; FP-CHECK-NEXT: .cfi_restore vg203; FP-CHECK-NEXT: .cfi_restore w30204; FP-CHECK-NEXT: .cfi_restore w29205; FP-CHECK-NEXT: .cfi_restore b8206; FP-CHECK-NEXT: .cfi_restore b9207; FP-CHECK-NEXT: .cfi_restore b10208; FP-CHECK-NEXT: .cfi_restore b11209; FP-CHECK-NEXT: .cfi_restore b12210; FP-CHECK-NEXT: .cfi_restore b13211; FP-CHECK-NEXT: .cfi_restore b14212; FP-CHECK-NEXT: .cfi_restore b15213; FP-CHECK-NEXT: ret214;215; OUTLINER-CHECK-LABEL: vg_unwind_needs_gap:216; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_217;218 call void asm sideeffect "", "~{x20}"()219 call void @callee();220 ret void;221}222 223define void @vg_unwind_with_fixed_args(<4 x i32> %x) #0 {224; CHECK-LABEL: vg_unwind_with_fixed_args:225; CHECK: // %bb.0:226; CHECK-NEXT: sub sp, sp, #112227; CHECK-NEXT: .cfi_def_cfa_offset 112228; CHECK-NEXT: cntd x9229; CHECK-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill230; CHECK-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill231; CHECK-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill232; CHECK-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill233; CHECK-NEXT: stp x29, x30, [sp, #80] // 16-byte Folded Spill234; CHECK-NEXT: str x9, [sp, #96] // 8-byte Spill235; CHECK-NEXT: .cfi_offset vg, -16236; CHECK-NEXT: .cfi_offset w30, -24237; CHECK-NEXT: .cfi_offset w29, -32238; CHECK-NEXT: .cfi_offset b8, -40239; CHECK-NEXT: .cfi_offset b9, -48240; CHECK-NEXT: .cfi_offset b10, -56241; CHECK-NEXT: .cfi_offset b11, -64242; CHECK-NEXT: .cfi_offset b12, -72243; CHECK-NEXT: .cfi_offset b13, -80244; CHECK-NEXT: .cfi_offset b14, -88245; CHECK-NEXT: .cfi_offset b15, -96246; CHECK-NEXT: str q0, [sp] // 16-byte Spill247; CHECK-NEXT: smstop sm248; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload249; CHECK-NEXT: bl fixed_callee250; CHECK-NEXT: smstart sm251; CHECK-NEXT: ldp x29, x30, [sp, #80] // 16-byte Folded Reload252; CHECK-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload253; CHECK-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload254; CHECK-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload255; CHECK-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload256; CHECK-NEXT: add sp, sp, #112257; CHECK-NEXT: .cfi_def_cfa_offset 0258; CHECK-NEXT: .cfi_restore vg259; CHECK-NEXT: .cfi_restore w30260; CHECK-NEXT: .cfi_restore w29261; CHECK-NEXT: .cfi_restore b8262; CHECK-NEXT: .cfi_restore b9263; CHECK-NEXT: .cfi_restore b10264; CHECK-NEXT: .cfi_restore b11265; CHECK-NEXT: .cfi_restore b12266; CHECK-NEXT: .cfi_restore b13267; CHECK-NEXT: .cfi_restore b14268; CHECK-NEXT: .cfi_restore b15269; CHECK-NEXT: ret270;271; FP-CHECK-LABEL: vg_unwind_with_fixed_args:272; FP-CHECK: // %bb.0:273; FP-CHECK-NEXT: sub sp, sp, #112274; FP-CHECK-NEXT: .cfi_def_cfa_offset 112275; FP-CHECK-NEXT: cntd x9276; FP-CHECK-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill277; FP-CHECK-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill278; FP-CHECK-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill279; FP-CHECK-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill280; FP-CHECK-NEXT: stp x29, x30, [sp, #80] // 16-byte Folded Spill281; FP-CHECK-NEXT: str x9, [sp, #96] // 8-byte Spill282; FP-CHECK-NEXT: add x29, sp, #80283; FP-CHECK-NEXT: .cfi_def_cfa w29, 32284; FP-CHECK-NEXT: .cfi_offset vg, -16285; FP-CHECK-NEXT: .cfi_offset w30, -24286; FP-CHECK-NEXT: .cfi_offset w29, -32287; FP-CHECK-NEXT: .cfi_offset b8, -40288; FP-CHECK-NEXT: .cfi_offset b9, -48289; FP-CHECK-NEXT: .cfi_offset b10, -56290; FP-CHECK-NEXT: .cfi_offset b11, -64291; FP-CHECK-NEXT: .cfi_offset b12, -72292; FP-CHECK-NEXT: .cfi_offset b13, -80293; FP-CHECK-NEXT: .cfi_offset b14, -88294; FP-CHECK-NEXT: .cfi_offset b15, -96295; FP-CHECK-NEXT: str q0, [sp] // 16-byte Spill296; FP-CHECK-NEXT: smstop sm297; FP-CHECK-NEXT: ldr q0, [sp] // 16-byte Reload298; FP-CHECK-NEXT: bl fixed_callee299; FP-CHECK-NEXT: smstart sm300; FP-CHECK-NEXT: .cfi_def_cfa wsp, 112301; FP-CHECK-NEXT: ldp x29, x30, [sp, #80] // 16-byte Folded Reload302; FP-CHECK-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload303; FP-CHECK-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload304; FP-CHECK-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload305; FP-CHECK-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload306; FP-CHECK-NEXT: add sp, sp, #112307; FP-CHECK-NEXT: .cfi_def_cfa_offset 0308; FP-CHECK-NEXT: .cfi_restore vg309; FP-CHECK-NEXT: .cfi_restore w30310; FP-CHECK-NEXT: .cfi_restore w29311; FP-CHECK-NEXT: .cfi_restore b8312; FP-CHECK-NEXT: .cfi_restore b9313; FP-CHECK-NEXT: .cfi_restore b10314; FP-CHECK-NEXT: .cfi_restore b11315; FP-CHECK-NEXT: .cfi_restore b12316; FP-CHECK-NEXT: .cfi_restore b13317; FP-CHECK-NEXT: .cfi_restore b14318; FP-CHECK-NEXT: .cfi_restore b15319; FP-CHECK-NEXT: ret320;321; OUTLINER-CHECK-LABEL: vg_unwind_with_fixed_args:322; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_323;324 call void @fixed_callee(<4 x i32> %x);325 ret void;326}327 328define void @vg_unwind_with_sve_args(<vscale x 2 x i64> %x) #0 {329; CHECK-LABEL: vg_unwind_with_sve_args:330; CHECK: // %bb.0:331; CHECK-NEXT: stp x29, x30, [sp, #-48]! // 16-byte Folded Spill332; CHECK-NEXT: .cfi_def_cfa_offset 48333; CHECK-NEXT: cntd x9334; CHECK-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill335; CHECK-NEXT: str x9, [sp, #16] // 8-byte Spill336; CHECK-NEXT: mov x29, sp337; CHECK-NEXT: .cfi_def_cfa w29, 48338; CHECK-NEXT: .cfi_offset w27, -8339; CHECK-NEXT: .cfi_offset w28, -16340; CHECK-NEXT: .cfi_offset vg, -32341; CHECK-NEXT: .cfi_offset w30, -40342; CHECK-NEXT: .cfi_offset w29, -48343; CHECK-NEXT: addvl sp, sp, #-18344; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill345; CHECK-NEXT: ptrue pn8.b346; CHECK-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill347; CHECK-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill348; CHECK-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #4, mul vl] // 32-byte Folded Spill349; CHECK-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill350; CHECK-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill351; CHECK-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #8, mul vl] // 32-byte Folded Spill352; CHECK-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill353; CHECK-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill354; CHECK-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #12, mul vl] // 32-byte Folded Spill355; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill356; CHECK-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill357; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill358; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill359; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill360; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill361; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill362; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill363; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill364; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill365; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill366; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x78, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d8 @ cfa - 8 * IncomingVG - 48367; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x70, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d9 @ cfa - 16 * IncomingVG - 48368; CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x68, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d10 @ cfa - 24 * IncomingVG - 48369; CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x60, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d11 @ cfa - 32 * IncomingVG - 48370; CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x58, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d12 @ cfa - 40 * IncomingVG - 48371; CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x50, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d13 @ cfa - 48 * IncomingVG - 48372; CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x48, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d14 @ cfa - 56 * IncomingVG - 48373; CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x40, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d15 @ cfa - 64 * IncomingVG - 48374; CHECK-NEXT: addvl sp, sp, #-1375; CHECK-NEXT: str z0, [x29, #-19, mul vl] // 16-byte Folded Spill376; CHECK-NEXT: //APP377; CHECK-NEXT: //NO_APP378; CHECK-NEXT: smstop sm379; CHECK-NEXT: rdvl x8, #1380; CHECK-NEXT: addsvl x8, x8, #-1381; CHECK-NEXT: cbz x8, .LBB3_2382; CHECK-NEXT: // %bb.1:383; CHECK-NEXT: brk #0x1384; CHECK-NEXT: .LBB3_2:385; CHECK-NEXT: ldr z0, [x29, #-19, mul vl] // 16-byte Folded Reload386; CHECK-NEXT: bl scalable_callee387; CHECK-NEXT: smstart sm388; CHECK-NEXT: addvl sp, sp, #1389; CHECK-NEXT: ptrue pn8.b390; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload391; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload392; CHECK-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload393; CHECK-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #4, mul vl] // 32-byte Folded Reload394; CHECK-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload395; CHECK-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #8, mul vl] // 32-byte Folded Reload396; CHECK-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload397; CHECK-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #12, mul vl] // 32-byte Folded Reload398; CHECK-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload399; CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload400; CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload401; CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload402; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload403; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload404; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload405; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload406; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload407; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload408; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload409; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload410; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload411; CHECK-NEXT: addvl sp, sp, #18412; CHECK-NEXT: .cfi_restore z8413; CHECK-NEXT: .cfi_restore z9414; CHECK-NEXT: .cfi_restore z10415; CHECK-NEXT: .cfi_restore z11416; CHECK-NEXT: .cfi_restore z12417; CHECK-NEXT: .cfi_restore z13418; CHECK-NEXT: .cfi_restore z14419; CHECK-NEXT: .cfi_restore z15420; CHECK-NEXT: .cfi_def_cfa wsp, 48421; CHECK-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload422; CHECK-NEXT: ldp x29, x30, [sp], #48 // 16-byte Folded Reload423; CHECK-NEXT: .cfi_def_cfa_offset 0424; CHECK-NEXT: .cfi_restore w27425; CHECK-NEXT: .cfi_restore w28426; CHECK-NEXT: .cfi_restore vg427; CHECK-NEXT: .cfi_restore w30428; CHECK-NEXT: .cfi_restore w29429; CHECK-NEXT: ret430;431; FP-CHECK-LABEL: vg_unwind_with_sve_args:432; FP-CHECK: // %bb.0:433; FP-CHECK-NEXT: stp x29, x30, [sp, #-48]! // 16-byte Folded Spill434; FP-CHECK-NEXT: .cfi_def_cfa_offset 48435; FP-CHECK-NEXT: cntd x9436; FP-CHECK-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill437; FP-CHECK-NEXT: str x9, [sp, #16] // 8-byte Spill438; FP-CHECK-NEXT: mov x29, sp439; FP-CHECK-NEXT: .cfi_def_cfa w29, 48440; FP-CHECK-NEXT: .cfi_offset w27, -8441; FP-CHECK-NEXT: .cfi_offset w28, -16442; FP-CHECK-NEXT: .cfi_offset vg, -32443; FP-CHECK-NEXT: .cfi_offset w30, -40444; FP-CHECK-NEXT: .cfi_offset w29, -48445; FP-CHECK-NEXT: addvl sp, sp, #-18446; FP-CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill447; FP-CHECK-NEXT: ptrue pn8.b448; FP-CHECK-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill449; FP-CHECK-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill450; FP-CHECK-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #4, mul vl] // 32-byte Folded Spill451; FP-CHECK-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill452; FP-CHECK-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill453; FP-CHECK-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #8, mul vl] // 32-byte Folded Spill454; FP-CHECK-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill455; FP-CHECK-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill456; FP-CHECK-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #12, mul vl] // 32-byte Folded Spill457; FP-CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill458; FP-CHECK-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill459; FP-CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill460; FP-CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill461; FP-CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill462; FP-CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill463; FP-CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill464; FP-CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill465; FP-CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill466; FP-CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill467; FP-CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill468; FP-CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x78, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d8 @ cfa - 8 * IncomingVG - 48469; FP-CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x70, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d9 @ cfa - 16 * IncomingVG - 48470; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x68, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d10 @ cfa - 24 * IncomingVG - 48471; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x60, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d11 @ cfa - 32 * IncomingVG - 48472; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x58, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d12 @ cfa - 40 * IncomingVG - 48473; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x50, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d13 @ cfa - 48 * IncomingVG - 48474; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x48, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d14 @ cfa - 56 * IncomingVG - 48475; FP-CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x0c, 0x12, 0x11, 0x60, 0x22, 0x06, 0x11, 0x40, 0x1e, 0x22, 0x11, 0x50, 0x22 // $d15 @ cfa - 64 * IncomingVG - 48476; FP-CHECK-NEXT: addvl sp, sp, #-1477; FP-CHECK-NEXT: str z0, [x29, #-19, mul vl] // 16-byte Folded Spill478; FP-CHECK-NEXT: //APP479; FP-CHECK-NEXT: //NO_APP480; FP-CHECK-NEXT: smstop sm481; FP-CHECK-NEXT: rdvl x8, #1482; FP-CHECK-NEXT: addsvl x8, x8, #-1483; FP-CHECK-NEXT: cbz x8, .LBB3_2484; FP-CHECK-NEXT: // %bb.1:485; FP-CHECK-NEXT: brk #0x1486; FP-CHECK-NEXT: .LBB3_2:487; FP-CHECK-NEXT: ldr z0, [x29, #-19, mul vl] // 16-byte Folded Reload488; FP-CHECK-NEXT: bl scalable_callee489; FP-CHECK-NEXT: smstart sm490; FP-CHECK-NEXT: addvl sp, sp, #1491; FP-CHECK-NEXT: ptrue pn8.b492; FP-CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload493; FP-CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload494; FP-CHECK-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload495; FP-CHECK-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #4, mul vl] // 32-byte Folded Reload496; FP-CHECK-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload497; FP-CHECK-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #8, mul vl] // 32-byte Folded Reload498; FP-CHECK-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload499; FP-CHECK-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #12, mul vl] // 32-byte Folded Reload500; FP-CHECK-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload501; FP-CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload502; FP-CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload503; FP-CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload504; FP-CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload505; FP-CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload506; FP-CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload507; FP-CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload508; FP-CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload509; FP-CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload510; FP-CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload511; FP-CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload512; FP-CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload513; FP-CHECK-NEXT: addvl sp, sp, #18514; FP-CHECK-NEXT: .cfi_restore z8515; FP-CHECK-NEXT: .cfi_restore z9516; FP-CHECK-NEXT: .cfi_restore z10517; FP-CHECK-NEXT: .cfi_restore z11518; FP-CHECK-NEXT: .cfi_restore z12519; FP-CHECK-NEXT: .cfi_restore z13520; FP-CHECK-NEXT: .cfi_restore z14521; FP-CHECK-NEXT: .cfi_restore z15522; FP-CHECK-NEXT: .cfi_def_cfa wsp, 48523; FP-CHECK-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload524; FP-CHECK-NEXT: ldp x29, x30, [sp], #48 // 16-byte Folded Reload525; FP-CHECK-NEXT: .cfi_def_cfa_offset 0526; FP-CHECK-NEXT: .cfi_restore w27527; FP-CHECK-NEXT: .cfi_restore w28528; FP-CHECK-NEXT: .cfi_restore vg529; FP-CHECK-NEXT: .cfi_restore w30530; FP-CHECK-NEXT: .cfi_restore w29531; FP-CHECK-NEXT: ret532;533; OUTLINER-CHECK-LABEL: vg_unwind_with_sve_args:534; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_535;536 call void asm sideeffect "", "~{x28}"()537 call void @scalable_callee(<vscale x 2 x i64> %x);538 ret void;539}540 541; This test was based on stack-probing-64k.ll and tries to test multiple uses of542; findScratchNonCalleeSaveRegister.543;544define void @vg_unwind_multiple_scratch_regs(ptr %out) #1 {545; CHECK-LABEL: vg_unwind_multiple_scratch_regs:546; CHECK: // %bb.0: // %entry547; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill548; CHECK-NEXT: .cfi_def_cfa_offset 96549; CHECK-NEXT: cntd x9550; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill551; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill552; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill553; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill554; CHECK-NEXT: stp x9, x28, [sp, #80] // 16-byte Folded Spill555; CHECK-NEXT: .cfi_offset w28, -8556; CHECK-NEXT: .cfi_offset vg, -16557; CHECK-NEXT: .cfi_offset w30, -24558; CHECK-NEXT: .cfi_offset w29, -32559; CHECK-NEXT: .cfi_offset b8, -40560; CHECK-NEXT: .cfi_offset b9, -48561; CHECK-NEXT: .cfi_offset b10, -56562; CHECK-NEXT: .cfi_offset b11, -64563; CHECK-NEXT: .cfi_offset b12, -72564; CHECK-NEXT: .cfi_offset b13, -80565; CHECK-NEXT: .cfi_offset b14, -88566; CHECK-NEXT: .cfi_offset b15, -96567; CHECK-NEXT: sub x9, sp, #80, lsl #12 // =327680568; CHECK-NEXT: .cfi_def_cfa w9, 327776569; CHECK-NEXT: .LBB4_1: // %entry570; CHECK-NEXT: // =>This Inner Loop Header: Depth=1571; CHECK-NEXT: sub sp, sp, #1, lsl #12 // =4096572; CHECK-NEXT: cmp sp, x9573; CHECK-NEXT: str xzr, [sp]574; CHECK-NEXT: b.ne .LBB4_1575; CHECK-NEXT: // %bb.2: // %entry576; CHECK-NEXT: .cfi_def_cfa_register wsp577; CHECK-NEXT: mov x8, sp578; CHECK-NEXT: str x8, [x0]579; CHECK-NEXT: smstop sm580; CHECK-NEXT: bl callee581; CHECK-NEXT: smstart sm582; CHECK-NEXT: add sp, sp, #80, lsl #12 // =327680583; CHECK-NEXT: .cfi_def_cfa_offset 96584; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload585; CHECK-NEXT: ldr x28, [sp, #88] // 8-byte Reload586; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload587; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload588; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload589; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload590; CHECK-NEXT: .cfi_def_cfa_offset 0591; CHECK-NEXT: .cfi_restore w28592; CHECK-NEXT: .cfi_restore vg593; CHECK-NEXT: .cfi_restore w30594; CHECK-NEXT: .cfi_restore w29595; CHECK-NEXT: .cfi_restore b8596; CHECK-NEXT: .cfi_restore b9597; CHECK-NEXT: .cfi_restore b10598; CHECK-NEXT: .cfi_restore b11599; CHECK-NEXT: .cfi_restore b12600; CHECK-NEXT: .cfi_restore b13601; CHECK-NEXT: .cfi_restore b14602; CHECK-NEXT: .cfi_restore b15603; CHECK-NEXT: ret604;605; FP-CHECK-LABEL: vg_unwind_multiple_scratch_regs:606; FP-CHECK: // %bb.0: // %entry607; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill608; FP-CHECK-NEXT: .cfi_def_cfa_offset 96609; FP-CHECK-NEXT: cntd x9610; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill611; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill612; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill613; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill614; FP-CHECK-NEXT: stp x9, x28, [sp, #80] // 16-byte Folded Spill615; FP-CHECK-NEXT: add x29, sp, #64616; FP-CHECK-NEXT: .cfi_def_cfa w29, 32617; FP-CHECK-NEXT: .cfi_offset w28, -8618; FP-CHECK-NEXT: .cfi_offset vg, -16619; FP-CHECK-NEXT: .cfi_offset w30, -24620; FP-CHECK-NEXT: .cfi_offset w29, -32621; FP-CHECK-NEXT: .cfi_offset b8, -40622; FP-CHECK-NEXT: .cfi_offset b9, -48623; FP-CHECK-NEXT: .cfi_offset b10, -56624; FP-CHECK-NEXT: .cfi_offset b11, -64625; FP-CHECK-NEXT: .cfi_offset b12, -72626; FP-CHECK-NEXT: .cfi_offset b13, -80627; FP-CHECK-NEXT: .cfi_offset b14, -88628; FP-CHECK-NEXT: .cfi_offset b15, -96629; FP-CHECK-NEXT: sub x9, sp, #80, lsl #12 // =327680630; FP-CHECK-NEXT: .LBB4_1: // %entry631; FP-CHECK-NEXT: // =>This Inner Loop Header: Depth=1632; FP-CHECK-NEXT: sub sp, sp, #1, lsl #12 // =4096633; FP-CHECK-NEXT: cmp sp, x9634; FP-CHECK-NEXT: str xzr, [sp]635; FP-CHECK-NEXT: b.ne .LBB4_1636; FP-CHECK-NEXT: // %bb.2: // %entry637; FP-CHECK-NEXT: mov x8, sp638; FP-CHECK-NEXT: str x8, [x0]639; FP-CHECK-NEXT: smstop sm640; FP-CHECK-NEXT: bl callee641; FP-CHECK-NEXT: smstart sm642; FP-CHECK-NEXT: add sp, sp, #80, lsl #12 // =327680643; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96644; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload645; FP-CHECK-NEXT: ldr x28, [sp, #88] // 8-byte Reload646; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload647; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload648; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload649; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload650; FP-CHECK-NEXT: .cfi_def_cfa_offset 0651; FP-CHECK-NEXT: .cfi_restore w28652; FP-CHECK-NEXT: .cfi_restore vg653; FP-CHECK-NEXT: .cfi_restore w30654; FP-CHECK-NEXT: .cfi_restore w29655; FP-CHECK-NEXT: .cfi_restore b8656; FP-CHECK-NEXT: .cfi_restore b9657; FP-CHECK-NEXT: .cfi_restore b10658; FP-CHECK-NEXT: .cfi_restore b11659; FP-CHECK-NEXT: .cfi_restore b12660; FP-CHECK-NEXT: .cfi_restore b13661; FP-CHECK-NEXT: .cfi_restore b14662; FP-CHECK-NEXT: .cfi_restore b15663; FP-CHECK-NEXT: ret664;665; OUTLINER-CHECK-LABEL: vg_unwind_multiple_scratch_regs:666; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_667;668entry:669 %v = alloca i8, i64 327680, align 1670 store ptr %v, ptr %out, align 8671 call void @callee()672 ret void673}674 675define void @vg_locally_streaming_fn() #3 {676; CHECK-LABEL: vg_locally_streaming_fn:677; CHECK: // %bb.0:678; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill679; CHECK-NEXT: .cfi_def_cfa_offset 96680; CHECK-NEXT: cntd x9681; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill682; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill683; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill684; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill685; CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill686; CHECK-NEXT: .cfi_offset vg, -16687; CHECK-NEXT: .cfi_offset w30, -24688; CHECK-NEXT: .cfi_offset w29, -32689; CHECK-NEXT: .cfi_offset b8, -40690; CHECK-NEXT: .cfi_offset b9, -48691; CHECK-NEXT: .cfi_offset b10, -56692; CHECK-NEXT: .cfi_offset b11, -64693; CHECK-NEXT: .cfi_offset b12, -72694; CHECK-NEXT: .cfi_offset b13, -80695; CHECK-NEXT: .cfi_offset b14, -88696; CHECK-NEXT: .cfi_offset b15, -96697; CHECK-NEXT: bl callee698; CHECK-NEXT: smstart sm699; CHECK-NEXT: bl streaming_callee700; CHECK-NEXT: smstop sm701; CHECK-NEXT: bl callee702; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload703; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload704; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload705; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload706; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload707; CHECK-NEXT: .cfi_def_cfa_offset 0708; CHECK-NEXT: .cfi_restore vg709; CHECK-NEXT: .cfi_restore w30710; CHECK-NEXT: .cfi_restore w29711; CHECK-NEXT: .cfi_restore b8712; CHECK-NEXT: .cfi_restore b9713; CHECK-NEXT: .cfi_restore b10714; CHECK-NEXT: .cfi_restore b11715; CHECK-NEXT: .cfi_restore b12716; CHECK-NEXT: .cfi_restore b13717; CHECK-NEXT: .cfi_restore b14718; CHECK-NEXT: .cfi_restore b15719; CHECK-NEXT: ret720;721; FP-CHECK-LABEL: vg_locally_streaming_fn:722; FP-CHECK: // %bb.0:723; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill724; FP-CHECK-NEXT: .cfi_def_cfa_offset 96725; FP-CHECK-NEXT: cntd x9726; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill727; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill728; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill729; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill730; FP-CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill731; FP-CHECK-NEXT: add x29, sp, #64732; FP-CHECK-NEXT: .cfi_def_cfa w29, 32733; FP-CHECK-NEXT: .cfi_offset vg, -16734; FP-CHECK-NEXT: .cfi_offset w30, -24735; FP-CHECK-NEXT: .cfi_offset w29, -32736; FP-CHECK-NEXT: .cfi_offset b8, -40737; FP-CHECK-NEXT: .cfi_offset b9, -48738; FP-CHECK-NEXT: .cfi_offset b10, -56739; FP-CHECK-NEXT: .cfi_offset b11, -64740; FP-CHECK-NEXT: .cfi_offset b12, -72741; FP-CHECK-NEXT: .cfi_offset b13, -80742; FP-CHECK-NEXT: .cfi_offset b14, -88743; FP-CHECK-NEXT: .cfi_offset b15, -96744; FP-CHECK-NEXT: bl callee745; FP-CHECK-NEXT: smstart sm746; FP-CHECK-NEXT: bl streaming_callee747; FP-CHECK-NEXT: smstop sm748; FP-CHECK-NEXT: bl callee749; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96750; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload751; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload752; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload753; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload754; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload755; FP-CHECK-NEXT: .cfi_def_cfa_offset 0756; FP-CHECK-NEXT: .cfi_restore vg757; FP-CHECK-NEXT: .cfi_restore w30758; FP-CHECK-NEXT: .cfi_restore w29759; FP-CHECK-NEXT: .cfi_restore b8760; FP-CHECK-NEXT: .cfi_restore b9761; FP-CHECK-NEXT: .cfi_restore b10762; FP-CHECK-NEXT: .cfi_restore b11763; FP-CHECK-NEXT: .cfi_restore b12764; FP-CHECK-NEXT: .cfi_restore b13765; FP-CHECK-NEXT: .cfi_restore b14766; FP-CHECK-NEXT: .cfi_restore b15767; FP-CHECK-NEXT: ret768;769; OUTLINER-CHECK-LABEL: vg_locally_streaming_fn:770; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_771;772 call void @callee()773 call void @streaming_callee()774 call void @callee()775 ret void776}777 778define void @streaming_compatible_to_streaming() #4 {779; CHECK-LABEL: streaming_compatible_to_streaming:780; CHECK: // %bb.0:781; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill782; CHECK-NEXT: .cfi_def_cfa_offset 96783; CHECK-NEXT: cntd x9784; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill785; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill786; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill787; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill788; CHECK-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill789; CHECK-NEXT: .cfi_offset w19, -8790; CHECK-NEXT: .cfi_offset vg, -16791; CHECK-NEXT: .cfi_offset w30, -24792; CHECK-NEXT: .cfi_offset w29, -32793; CHECK-NEXT: .cfi_offset b8, -40794; CHECK-NEXT: .cfi_offset b9, -48795; CHECK-NEXT: .cfi_offset b10, -56796; CHECK-NEXT: .cfi_offset b11, -64797; CHECK-NEXT: .cfi_offset b12, -72798; CHECK-NEXT: .cfi_offset b13, -80799; CHECK-NEXT: .cfi_offset b14, -88800; CHECK-NEXT: .cfi_offset b15, -96801; CHECK-NEXT: mrs x19, SVCR802; CHECK-NEXT: tbnz w19, #0, .LBB6_2803; CHECK-NEXT: // %bb.1:804; CHECK-NEXT: smstart sm805; CHECK-NEXT: .LBB6_2:806; CHECK-NEXT: bl streaming_callee807; CHECK-NEXT: tbnz w19, #0, .LBB6_4808; CHECK-NEXT: // %bb.3:809; CHECK-NEXT: smstop sm810; CHECK-NEXT: .LBB6_4:811; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload812; CHECK-NEXT: ldr x19, [sp, #88] // 8-byte Reload813; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload814; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload815; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload816; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload817; CHECK-NEXT: .cfi_def_cfa_offset 0818; CHECK-NEXT: .cfi_restore w19819; CHECK-NEXT: .cfi_restore vg820; CHECK-NEXT: .cfi_restore w30821; CHECK-NEXT: .cfi_restore w29822; CHECK-NEXT: .cfi_restore b8823; CHECK-NEXT: .cfi_restore b9824; CHECK-NEXT: .cfi_restore b10825; CHECK-NEXT: .cfi_restore b11826; CHECK-NEXT: .cfi_restore b12827; CHECK-NEXT: .cfi_restore b13828; CHECK-NEXT: .cfi_restore b14829; CHECK-NEXT: .cfi_restore b15830; CHECK-NEXT: ret831;832; FP-CHECK-LABEL: streaming_compatible_to_streaming:833; FP-CHECK: // %bb.0:834; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill835; FP-CHECK-NEXT: .cfi_def_cfa_offset 96836; FP-CHECK-NEXT: cntd x9837; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill838; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill839; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill840; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill841; FP-CHECK-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill842; FP-CHECK-NEXT: add x29, sp, #64843; FP-CHECK-NEXT: .cfi_def_cfa w29, 32844; FP-CHECK-NEXT: .cfi_offset w19, -8845; FP-CHECK-NEXT: .cfi_offset vg, -16846; FP-CHECK-NEXT: .cfi_offset w30, -24847; FP-CHECK-NEXT: .cfi_offset w29, -32848; FP-CHECK-NEXT: .cfi_offset b8, -40849; FP-CHECK-NEXT: .cfi_offset b9, -48850; FP-CHECK-NEXT: .cfi_offset b10, -56851; FP-CHECK-NEXT: .cfi_offset b11, -64852; FP-CHECK-NEXT: .cfi_offset b12, -72853; FP-CHECK-NEXT: .cfi_offset b13, -80854; FP-CHECK-NEXT: .cfi_offset b14, -88855; FP-CHECK-NEXT: .cfi_offset b15, -96856; FP-CHECK-NEXT: mrs x19, SVCR857; FP-CHECK-NEXT: tbnz w19, #0, .LBB6_2858; FP-CHECK-NEXT: // %bb.1:859; FP-CHECK-NEXT: smstart sm860; FP-CHECK-NEXT: .LBB6_2:861; FP-CHECK-NEXT: bl streaming_callee862; FP-CHECK-NEXT: tbnz w19, #0, .LBB6_4863; FP-CHECK-NEXT: // %bb.3:864; FP-CHECK-NEXT: smstop sm865; FP-CHECK-NEXT: .LBB6_4:866; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96867; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload868; FP-CHECK-NEXT: ldr x19, [sp, #88] // 8-byte Reload869; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload870; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload871; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload872; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload873; FP-CHECK-NEXT: .cfi_def_cfa_offset 0874; FP-CHECK-NEXT: .cfi_restore w19875; FP-CHECK-NEXT: .cfi_restore vg876; FP-CHECK-NEXT: .cfi_restore w30877; FP-CHECK-NEXT: .cfi_restore w29878; FP-CHECK-NEXT: .cfi_restore b8879; FP-CHECK-NEXT: .cfi_restore b9880; FP-CHECK-NEXT: .cfi_restore b10881; FP-CHECK-NEXT: .cfi_restore b11882; FP-CHECK-NEXT: .cfi_restore b12883; FP-CHECK-NEXT: .cfi_restore b13884; FP-CHECK-NEXT: .cfi_restore b14885; FP-CHECK-NEXT: .cfi_restore b15886; FP-CHECK-NEXT: ret887;888; OUTLINER-CHECK-LABEL: streaming_compatible_to_streaming:889; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_890;891 call void @streaming_callee()892 ret void893}894 895define void @streaming_compatible_to_non_streaming() #4 {896; CHECK-LABEL: streaming_compatible_to_non_streaming:897; CHECK: // %bb.0:898; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill899; CHECK-NEXT: .cfi_def_cfa_offset 96900; CHECK-NEXT: cntd x9901; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill902; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill903; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill904; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill905; CHECK-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill906; CHECK-NEXT: .cfi_offset w19, -8907; CHECK-NEXT: .cfi_offset vg, -16908; CHECK-NEXT: .cfi_offset w30, -24909; CHECK-NEXT: .cfi_offset w29, -32910; CHECK-NEXT: .cfi_offset b8, -40911; CHECK-NEXT: .cfi_offset b9, -48912; CHECK-NEXT: .cfi_offset b10, -56913; CHECK-NEXT: .cfi_offset b11, -64914; CHECK-NEXT: .cfi_offset b12, -72915; CHECK-NEXT: .cfi_offset b13, -80916; CHECK-NEXT: .cfi_offset b14, -88917; CHECK-NEXT: .cfi_offset b15, -96918; CHECK-NEXT: mrs x19, SVCR919; CHECK-NEXT: tbz w19, #0, .LBB7_2920; CHECK-NEXT: // %bb.1:921; CHECK-NEXT: smstop sm922; CHECK-NEXT: .LBB7_2:923; CHECK-NEXT: bl callee924; CHECK-NEXT: tbz w19, #0, .LBB7_4925; CHECK-NEXT: // %bb.3:926; CHECK-NEXT: smstart sm927; CHECK-NEXT: .LBB7_4:928; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload929; CHECK-NEXT: ldr x19, [sp, #88] // 8-byte Reload930; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload931; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload932; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload933; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload934; CHECK-NEXT: .cfi_def_cfa_offset 0935; CHECK-NEXT: .cfi_restore w19936; CHECK-NEXT: .cfi_restore vg937; CHECK-NEXT: .cfi_restore w30938; CHECK-NEXT: .cfi_restore w29939; CHECK-NEXT: .cfi_restore b8940; CHECK-NEXT: .cfi_restore b9941; CHECK-NEXT: .cfi_restore b10942; CHECK-NEXT: .cfi_restore b11943; CHECK-NEXT: .cfi_restore b12944; CHECK-NEXT: .cfi_restore b13945; CHECK-NEXT: .cfi_restore b14946; CHECK-NEXT: .cfi_restore b15947; CHECK-NEXT: ret948;949; FP-CHECK-LABEL: streaming_compatible_to_non_streaming:950; FP-CHECK: // %bb.0:951; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill952; FP-CHECK-NEXT: .cfi_def_cfa_offset 96953; FP-CHECK-NEXT: cntd x9954; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill955; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill956; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill957; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill958; FP-CHECK-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill959; FP-CHECK-NEXT: add x29, sp, #64960; FP-CHECK-NEXT: .cfi_def_cfa w29, 32961; FP-CHECK-NEXT: .cfi_offset w19, -8962; FP-CHECK-NEXT: .cfi_offset vg, -16963; FP-CHECK-NEXT: .cfi_offset w30, -24964; FP-CHECK-NEXT: .cfi_offset w29, -32965; FP-CHECK-NEXT: .cfi_offset b8, -40966; FP-CHECK-NEXT: .cfi_offset b9, -48967; FP-CHECK-NEXT: .cfi_offset b10, -56968; FP-CHECK-NEXT: .cfi_offset b11, -64969; FP-CHECK-NEXT: .cfi_offset b12, -72970; FP-CHECK-NEXT: .cfi_offset b13, -80971; FP-CHECK-NEXT: .cfi_offset b14, -88972; FP-CHECK-NEXT: .cfi_offset b15, -96973; FP-CHECK-NEXT: mrs x19, SVCR974; FP-CHECK-NEXT: tbz w19, #0, .LBB7_2975; FP-CHECK-NEXT: // %bb.1:976; FP-CHECK-NEXT: smstop sm977; FP-CHECK-NEXT: .LBB7_2:978; FP-CHECK-NEXT: bl callee979; FP-CHECK-NEXT: tbz w19, #0, .LBB7_4980; FP-CHECK-NEXT: // %bb.3:981; FP-CHECK-NEXT: smstart sm982; FP-CHECK-NEXT: .LBB7_4:983; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96984; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload985; FP-CHECK-NEXT: ldr x19, [sp, #88] // 8-byte Reload986; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload987; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload988; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload989; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload990; FP-CHECK-NEXT: .cfi_def_cfa_offset 0991; FP-CHECK-NEXT: .cfi_restore w19992; FP-CHECK-NEXT: .cfi_restore vg993; FP-CHECK-NEXT: .cfi_restore w30994; FP-CHECK-NEXT: .cfi_restore w29995; FP-CHECK-NEXT: .cfi_restore b8996; FP-CHECK-NEXT: .cfi_restore b9997; FP-CHECK-NEXT: .cfi_restore b10998; FP-CHECK-NEXT: .cfi_restore b11999; FP-CHECK-NEXT: .cfi_restore b121000; FP-CHECK-NEXT: .cfi_restore b131001; FP-CHECK-NEXT: .cfi_restore b141002; FP-CHECK-NEXT: .cfi_restore b151003; FP-CHECK-NEXT: ret1004;1005; OUTLINER-CHECK-LABEL: streaming_compatible_to_non_streaming:1006; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_1007;1008 call void @callee()1009 ret void1010}1011 1012; If the target does not have SVE, do not emit cntd in the prologue and1013; instead spill the result returned by __arm_get_current_vg.1014; This requires preserving the argument %x as the vg value is returned1015; in X0.1016;1017define void @streaming_compatible_no_sve(i32 noundef %x) #4 {1018; NO-SVE-CHECK-LABEL: streaming_compatible_no_sve:1019; NO-SVE-CHECK: // %bb.0:1020; NO-SVE-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill1021; NO-SVE-CHECK-NEXT: .cfi_def_cfa_offset 961022; NO-SVE-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill1023; NO-SVE-CHECK-NEXT: mov x9, x01024; NO-SVE-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill1025; NO-SVE-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill1026; NO-SVE-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill1027; NO-SVE-CHECK-NEXT: bl __arm_get_current_vg1028; NO-SVE-CHECK-NEXT: stp x0, x19, [sp, #80] // 16-byte Folded Spill1029; NO-SVE-CHECK-NEXT: mov x0, x91030; NO-SVE-CHECK-NEXT: add x29, sp, #641031; NO-SVE-CHECK-NEXT: .cfi_def_cfa w29, 321032; NO-SVE-CHECK-NEXT: .cfi_offset w19, -81033; NO-SVE-CHECK-NEXT: .cfi_offset vg, -161034; NO-SVE-CHECK-NEXT: .cfi_offset w30, -241035; NO-SVE-CHECK-NEXT: .cfi_offset w29, -321036; NO-SVE-CHECK-NEXT: .cfi_offset b8, -401037; NO-SVE-CHECK-NEXT: .cfi_offset b9, -481038; NO-SVE-CHECK-NEXT: .cfi_offset b10, -561039; NO-SVE-CHECK-NEXT: .cfi_offset b11, -641040; NO-SVE-CHECK-NEXT: .cfi_offset b12, -721041; NO-SVE-CHECK-NEXT: .cfi_offset b13, -801042; NO-SVE-CHECK-NEXT: .cfi_offset b14, -881043; NO-SVE-CHECK-NEXT: .cfi_offset b15, -961044; NO-SVE-CHECK-NEXT: mrs x19, SVCR1045; NO-SVE-CHECK-NEXT: tbnz w19, #0, .LBB8_21046; NO-SVE-CHECK-NEXT: // %bb.1:1047; NO-SVE-CHECK-NEXT: smstart sm1048; NO-SVE-CHECK-NEXT: .LBB8_2:1049; NO-SVE-CHECK-NEXT: bl streaming_callee_with_arg1050; NO-SVE-CHECK-NEXT: tbnz w19, #0, .LBB8_41051; NO-SVE-CHECK-NEXT: // %bb.3:1052; NO-SVE-CHECK-NEXT: smstop sm1053; NO-SVE-CHECK-NEXT: .LBB8_4:1054; NO-SVE-CHECK-NEXT: .cfi_def_cfa wsp, 961055; NO-SVE-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload1056; NO-SVE-CHECK-NEXT: ldr x19, [sp, #88] // 8-byte Reload1057; NO-SVE-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload1058; NO-SVE-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload1059; NO-SVE-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload1060; NO-SVE-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload1061; NO-SVE-CHECK-NEXT: .cfi_def_cfa_offset 01062; NO-SVE-CHECK-NEXT: .cfi_restore w191063; NO-SVE-CHECK-NEXT: .cfi_restore vg1064; NO-SVE-CHECK-NEXT: .cfi_restore w301065; NO-SVE-CHECK-NEXT: .cfi_restore w291066; NO-SVE-CHECK-NEXT: .cfi_restore b81067; NO-SVE-CHECK-NEXT: .cfi_restore b91068; NO-SVE-CHECK-NEXT: .cfi_restore b101069; NO-SVE-CHECK-NEXT: .cfi_restore b111070; NO-SVE-CHECK-NEXT: .cfi_restore b121071; NO-SVE-CHECK-NEXT: .cfi_restore b131072; NO-SVE-CHECK-NEXT: .cfi_restore b141073; NO-SVE-CHECK-NEXT: .cfi_restore b151074; NO-SVE-CHECK-NEXT: ret1075;1076; OUTLINER-CHECK-LABEL: streaming_compatible_no_sve:1077; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_1078;1079 call void @streaming_callee_with_arg(i32 %x)1080 ret void1081}1082 1083; The algorithm that fixes up the offsets of the callee-save/restore1084; instructions must jump over the instructions that instantiate the current1085; 'VG' value. We must make sure that it doesn't consider any RDSVL in1086; user-code as if it is part of the frame-setup when doing so.1087define void @test_rdsvl_right_after_prologue(i64 %x0) nounwind {1088; NO-SVE-CHECK-LABEL: test_rdsvl_right_after_prologue:1089; NO-SVE-CHECK: // %bb.0:1090; NO-SVE-CHECK-NEXT: sub sp, sp, #961091; NO-SVE-CHECK-NEXT: rdsvl x8, #11092; NO-SVE-CHECK-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill1093; NO-SVE-CHECK-NEXT: mov x1, x01094; NO-SVE-CHECK-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill1095; NO-SVE-CHECK-NEXT: lsr x8, x8, #31096; NO-SVE-CHECK-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill1097; NO-SVE-CHECK-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill1098; NO-SVE-CHECK-NEXT: stp x29, x30, [sp, #80] // 16-byte Folded Spill1099; NO-SVE-CHECK-NEXT: add x29, sp, #801100; NO-SVE-CHECK-NEXT: smstart sm1101; NO-SVE-CHECK-NEXT: mov x0, x81102; NO-SVE-CHECK-NEXT: bl bar1103; NO-SVE-CHECK-NEXT: smstop sm1104; NO-SVE-CHECK-NEXT: ldp x29, x30, [sp, #80] // 16-byte Folded Reload1105; NO-SVE-CHECK-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload1106; NO-SVE-CHECK-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload1107; NO-SVE-CHECK-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload1108; NO-SVE-CHECK-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload1109; NO-SVE-CHECK-NEXT: add sp, sp, #961110; NO-SVE-CHECK-NEXT: ret1111;1112 %some_alloc = alloca i64, align 81113 %rdsvl = tail call i64 @llvm.aarch64.sme.cntsd()1114 call void @bar(i64 %rdsvl, i64 %x0)1115 ret void1116}1117 1118declare void @bar(i64, i64) "aarch64_pstate_sm_enabled"1119 1120; Ensure we still emit async unwind information with -fno-asynchronous-unwind-tables1121; if the function contains a streaming-mode change.1122 1123define void @vg_unwind_noasync() #5 {1124; CHECK-LABEL: vg_unwind_noasync:1125; CHECK: // %bb.0:1126; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill1127; CHECK-NEXT: .cfi_def_cfa_offset 961128; CHECK-NEXT: cntd x91129; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill1130; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill1131; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill1132; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill1133; CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill1134; CHECK-NEXT: .cfi_offset vg, -161135; CHECK-NEXT: .cfi_offset w30, -241136; CHECK-NEXT: .cfi_offset w29, -321137; CHECK-NEXT: .cfi_offset b8, -401138; CHECK-NEXT: .cfi_offset b9, -481139; CHECK-NEXT: .cfi_offset b10, -561140; CHECK-NEXT: .cfi_offset b11, -641141; CHECK-NEXT: .cfi_offset b12, -721142; CHECK-NEXT: .cfi_offset b13, -801143; CHECK-NEXT: .cfi_offset b14, -881144; CHECK-NEXT: .cfi_offset b15, -961145; CHECK-NEXT: smstop sm1146; CHECK-NEXT: bl callee1147; CHECK-NEXT: smstart sm1148; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload1149; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload1150; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload1151; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload1152; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload1153; CHECK-NEXT: .cfi_def_cfa_offset 01154; CHECK-NEXT: .cfi_restore vg1155; CHECK-NEXT: .cfi_restore w301156; CHECK-NEXT: .cfi_restore w291157; CHECK-NEXT: .cfi_restore b81158; CHECK-NEXT: .cfi_restore b91159; CHECK-NEXT: .cfi_restore b101160; CHECK-NEXT: .cfi_restore b111161; CHECK-NEXT: .cfi_restore b121162; CHECK-NEXT: .cfi_restore b131163; CHECK-NEXT: .cfi_restore b141164; CHECK-NEXT: .cfi_restore b151165; CHECK-NEXT: ret1166;1167; FP-CHECK-LABEL: vg_unwind_noasync:1168; FP-CHECK: // %bb.0:1169; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill1170; FP-CHECK-NEXT: .cfi_def_cfa_offset 961171; FP-CHECK-NEXT: cntd x91172; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill1173; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill1174; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill1175; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill1176; FP-CHECK-NEXT: str x9, [sp, #80] // 8-byte Spill1177; FP-CHECK-NEXT: add x29, sp, #641178; FP-CHECK-NEXT: .cfi_def_cfa w29, 321179; FP-CHECK-NEXT: .cfi_offset vg, -161180; FP-CHECK-NEXT: .cfi_offset w30, -241181; FP-CHECK-NEXT: .cfi_offset w29, -321182; FP-CHECK-NEXT: .cfi_offset b8, -401183; FP-CHECK-NEXT: .cfi_offset b9, -481184; FP-CHECK-NEXT: .cfi_offset b10, -561185; FP-CHECK-NEXT: .cfi_offset b11, -641186; FP-CHECK-NEXT: .cfi_offset b12, -721187; FP-CHECK-NEXT: .cfi_offset b13, -801188; FP-CHECK-NEXT: .cfi_offset b14, -881189; FP-CHECK-NEXT: .cfi_offset b15, -961190; FP-CHECK-NEXT: smstop sm1191; FP-CHECK-NEXT: bl callee1192; FP-CHECK-NEXT: smstart sm1193; FP-CHECK-NEXT: .cfi_def_cfa wsp, 961194; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload1195; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload1196; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload1197; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload1198; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload1199; FP-CHECK-NEXT: .cfi_def_cfa_offset 01200; FP-CHECK-NEXT: .cfi_restore vg1201; FP-CHECK-NEXT: .cfi_restore w301202; FP-CHECK-NEXT: .cfi_restore w291203; FP-CHECK-NEXT: .cfi_restore b81204; FP-CHECK-NEXT: .cfi_restore b91205; FP-CHECK-NEXT: .cfi_restore b101206; FP-CHECK-NEXT: .cfi_restore b111207; FP-CHECK-NEXT: .cfi_restore b121208; FP-CHECK-NEXT: .cfi_restore b131209; FP-CHECK-NEXT: .cfi_restore b141210; FP-CHECK-NEXT: .cfi_restore b151211; FP-CHECK-NEXT: ret1212;1213; OUTLINER-CHECK-LABEL: vg_unwind_noasync:1214; OUTLINER-CHECK-NOT: OUTLINED_FUNCTION_1215;1216 call void @callee();1217 ret void;1218}1219 1220attributes #0 = { "aarch64_pstate_sm_enabled" uwtable(async) }1221attributes #1 = { "probe-stack"="inline-asm" "aarch64_pstate_sm_enabled" uwtable(async) }1222attributes #3 = { "aarch64_pstate_sm_body" uwtable(async) }1223attributes #4 = { "aarch64_pstate_sm_compatible" uwtable(async) }1224attributes #5 = { "aarch64_pstate_sm_enabled" }1225