456 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -start-after=simplifycfg -enable-tail-merge=false -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -start-after=simplifycfg -enable-tail-merge=false -aarch64-new-sme-abi -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-NEWLOWERING4 5;6; Private-ZA Callee7;8 9; Expect spill & fill of ZT0 around call10; Expect smstop/smstart za around call11define void @zt0_in_caller_no_state_callee(ptr %callee) "aarch64_in_zt0" nounwind {12; CHECK-COMMON-LABEL: zt0_in_caller_no_state_callee:13; CHECK-COMMON: // %bb.0:14; CHECK-COMMON-NEXT: sub sp, sp, #8015; CHECK-COMMON-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill16; CHECK-COMMON-NEXT: mov x19, sp17; CHECK-COMMON-NEXT: str zt0, [x19]18; CHECK-COMMON-NEXT: smstop za19; CHECK-COMMON-NEXT: blr x020; CHECK-COMMON-NEXT: smstart za21; CHECK-COMMON-NEXT: ldr zt0, [x19]22; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload23; CHECK-COMMON-NEXT: add sp, sp, #8024; CHECK-COMMON-NEXT: ret25 call void %callee();26 ret void;27}28 29; Expect spill & fill of ZT0 around call30; Expect setup and restore lazy-save around call31; Expect smstart za after call32define void @za_zt0_shared_caller_no_state_callee(ptr %callee) "aarch64_inout_za" "aarch64_in_zt0" nounwind {33; CHECK-LABEL: za_zt0_shared_caller_no_state_callee:34; CHECK: // %bb.0:35; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill36; CHECK-NEXT: str x19, [sp, #16] // 8-byte Spill37; CHECK-NEXT: mov x29, sp38; CHECK-NEXT: sub sp, sp, #8039; CHECK-NEXT: rdsvl x8, #140; CHECK-NEXT: mov x9, sp41; CHECK-NEXT: msub x9, x8, x8, x942; CHECK-NEXT: mov sp, x943; CHECK-NEXT: sub x10, x29, #1644; CHECK-NEXT: sub x19, x29, #8045; CHECK-NEXT: stp x9, x8, [x29, #-16]46; CHECK-NEXT: msr TPIDR2_EL0, x1047; CHECK-NEXT: str zt0, [x19]48; CHECK-NEXT: blr x049; CHECK-NEXT: smstart za50; CHECK-NEXT: ldr zt0, [x19]51; CHECK-NEXT: mrs x8, TPIDR2_EL052; CHECK-NEXT: sub x0, x29, #1653; CHECK-NEXT: cbnz x8, .LBB1_254; CHECK-NEXT: // %bb.1:55; CHECK-NEXT: bl __arm_tpidr2_restore56; CHECK-NEXT: .LBB1_2:57; CHECK-NEXT: msr TPIDR2_EL0, xzr58; CHECK-NEXT: mov sp, x2959; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Reload60; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload61; CHECK-NEXT: ret62;63; CHECK-NEWLOWERING-LABEL: za_zt0_shared_caller_no_state_callee:64; CHECK-NEWLOWERING: // %bb.0:65; CHECK-NEWLOWERING-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill66; CHECK-NEWLOWERING-NEXT: str x19, [sp, #16] // 8-byte Spill67; CHECK-NEWLOWERING-NEXT: mov x29, sp68; CHECK-NEWLOWERING-NEXT: sub sp, sp, #8069; CHECK-NEWLOWERING-NEXT: rdsvl x8, #170; CHECK-NEWLOWERING-NEXT: mov x9, sp71; CHECK-NEWLOWERING-NEXT: msub x9, x8, x8, x972; CHECK-NEWLOWERING-NEXT: mov sp, x973; CHECK-NEWLOWERING-NEXT: sub x19, x29, #6474; CHECK-NEWLOWERING-NEXT: sub x10, x29, #8075; CHECK-NEWLOWERING-NEXT: stp x9, x8, [x29, #-80]76; CHECK-NEWLOWERING-NEXT: str zt0, [x19]77; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, x1078; CHECK-NEWLOWERING-NEXT: blr x079; CHECK-NEWLOWERING-NEXT: smstart za80; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL081; CHECK-NEWLOWERING-NEXT: sub x0, x29, #8082; CHECK-NEWLOWERING-NEXT: cbnz x8, .LBB1_283; CHECK-NEWLOWERING-NEXT: // %bb.1:84; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_restore85; CHECK-NEWLOWERING-NEXT: .LBB1_2:86; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr87; CHECK-NEWLOWERING-NEXT: ldr zt0, [x19]88; CHECK-NEWLOWERING-NEXT: mov sp, x2989; CHECK-NEWLOWERING-NEXT: ldr x19, [sp, #16] // 8-byte Reload90; CHECK-NEWLOWERING-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload91; CHECK-NEWLOWERING-NEXT: ret92 call void %callee();93 ret void;94}95 96;97; Shared-ZA Callee98;99 100; Caller and callee have shared ZT0 state, no spill/fill of ZT0 required101define void @zt0_shared_caller_zt0_shared_callee(ptr %callee) "aarch64_in_zt0" nounwind {102; CHECK-COMMON-LABEL: zt0_shared_caller_zt0_shared_callee:103; CHECK-COMMON: // %bb.0:104; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill105; CHECK-COMMON-NEXT: blr x0106; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload107; CHECK-COMMON-NEXT: ret108 call void %callee() "aarch64_in_zt0";109 ret void;110}111 112; Expect spill & fill of ZT0 around call113define void @za_zt0_shared_caller_za_shared_callee(ptr %callee) "aarch64_inout_za" "aarch64_in_zt0" nounwind {114; CHECK-COMMON-LABEL: za_zt0_shared_caller_za_shared_callee:115; CHECK-COMMON: // %bb.0:116; CHECK-COMMON-NEXT: sub sp, sp, #80117; CHECK-COMMON-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill118; CHECK-COMMON-NEXT: mov x19, sp119; CHECK-COMMON-NEXT: str zt0, [x19]120; CHECK-COMMON-NEXT: blr x0121; CHECK-COMMON-NEXT: ldr zt0, [x19]122; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload123; CHECK-COMMON-NEXT: add sp, sp, #80124; CHECK-COMMON-NEXT: ret125 call void %callee() "aarch64_inout_za";126 ret void;127}128 129; Caller and callee have shared ZA & ZT0130define void @za_zt0_shared_caller_za_zt0_shared_callee(ptr %callee) "aarch64_inout_za" "aarch64_in_zt0" nounwind {131; CHECK-COMMON-LABEL: za_zt0_shared_caller_za_zt0_shared_callee:132; CHECK-COMMON: // %bb.0:133; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill134; CHECK-COMMON-NEXT: blr x0135; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload136; CHECK-COMMON-NEXT: ret137 call void %callee() "aarch64_inout_za" "aarch64_in_zt0";138 ret void;139}140 141; New-ZT0 Callee142 143; Expect spill & fill of ZT0 around call144; Expect smstop/smstart za around call145define void @zt0_in_caller_zt0_new_callee(ptr %callee) "aarch64_in_zt0" nounwind {146; CHECK-COMMON-LABEL: zt0_in_caller_zt0_new_callee:147; CHECK-COMMON: // %bb.0:148; CHECK-COMMON-NEXT: sub sp, sp, #80149; CHECK-COMMON-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill150; CHECK-COMMON-NEXT: mov x19, sp151; CHECK-COMMON-NEXT: str zt0, [x19]152; CHECK-COMMON-NEXT: smstop za153; CHECK-COMMON-NEXT: blr x0154; CHECK-COMMON-NEXT: smstart za155; CHECK-COMMON-NEXT: ldr zt0, [x19]156; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload157; CHECK-COMMON-NEXT: add sp, sp, #80158; CHECK-COMMON-NEXT: ret159 call void %callee() "aarch64_new_zt0";160 ret void;161}162 163; New-ZT0 Callee164 165; Expect commit of lazy-save if ZA is dormant166; Expect smstart ZA & clear ZT0167; Expect spill & fill of ZT0 around call168; Before return, expect smstop ZA169define void @zt0_new_caller_zt0_new_callee(ptr %callee) "aarch64_new_zt0" nounwind {170; CHECK-LABEL: zt0_new_caller_zt0_new_callee:171; CHECK: // %bb.0: // %prelude172; CHECK-NEXT: sub sp, sp, #80173; CHECK-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill174; CHECK-NEXT: mrs x8, TPIDR2_EL0175; CHECK-NEXT: cbz x8, .LBB6_2176; CHECK-NEXT: // %bb.1: // %save.za177; CHECK-NEXT: bl __arm_tpidr2_save178; CHECK-NEXT: msr TPIDR2_EL0, xzr179; CHECK-NEXT: .LBB6_2:180; CHECK-NEXT: smstart za181; CHECK-NEXT: zero { zt0 }182; CHECK-NEXT: mov x19, sp183; CHECK-NEXT: str zt0, [x19]184; CHECK-NEXT: smstop za185; CHECK-NEXT: blr x0186; CHECK-NEXT: smstart za187; CHECK-NEXT: ldr zt0, [x19]188; CHECK-NEXT: smstop za189; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload190; CHECK-NEXT: add sp, sp, #80191; CHECK-NEXT: ret192;193; CHECK-NEWLOWERING-LABEL: zt0_new_caller_zt0_new_callee:194; CHECK-NEWLOWERING: // %bb.0:195; CHECK-NEWLOWERING-NEXT: sub sp, sp, #80196; CHECK-NEWLOWERING-NEXT: str x30, [sp, #64] // 8-byte Spill197; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0198; CHECK-NEWLOWERING-NEXT: cbz x8, .LBB6_2199; CHECK-NEWLOWERING-NEXT: // %bb.1:200; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save201; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr202; CHECK-NEWLOWERING-NEXT: zero { zt0 }203; CHECK-NEWLOWERING-NEXT: .LBB6_2:204; CHECK-NEWLOWERING-NEXT: smstart za205; CHECK-NEWLOWERING-NEXT: mov x8, sp206; CHECK-NEWLOWERING-NEXT: str zt0, [x8]207; CHECK-NEWLOWERING-NEXT: smstop za208; CHECK-NEWLOWERING-NEXT: blr x0209; CHECK-NEWLOWERING-NEXT: ldr x30, [sp, #64] // 8-byte Reload210; CHECK-NEWLOWERING-NEXT: add sp, sp, #80211; CHECK-NEWLOWERING-NEXT: ret212 call void %callee() "aarch64_new_zt0";213 ret void;214}215 216; Expect commit of lazy-save if ZA is dormant217; Expect smstart ZA & clear ZT0218; No spill & fill of ZT0 around __arm_tpidr2_save219; Expect spill & fill of ZT0 around __arm_sme_state call220; Before return, expect smstop ZA221define i64 @zt0_new_caller_abi_routine_callee() "aarch64_new_zt0" nounwind {222; CHECK-LABEL: zt0_new_caller_abi_routine_callee:223; CHECK: // %bb.0: // %prelude224; CHECK-NEXT: sub sp, sp, #80225; CHECK-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill226; CHECK-NEXT: mrs x8, TPIDR2_EL0227; CHECK-NEXT: cbz x8, .LBB7_2228; CHECK-NEXT: // %bb.1: // %save.za229; CHECK-NEXT: bl __arm_tpidr2_save230; CHECK-NEXT: msr TPIDR2_EL0, xzr231; CHECK-NEXT: .LBB7_2:232; CHECK-NEXT: smstart za233; CHECK-NEXT: zero { zt0 }234; CHECK-NEXT: mov x19, sp235; CHECK-NEXT: str zt0, [x19]236; CHECK-NEXT: bl __arm_sme_state237; CHECK-NEXT: ldr zt0, [x19]238; CHECK-NEXT: smstop za239; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload240; CHECK-NEXT: add sp, sp, #80241; CHECK-NEXT: ret242;243; CHECK-NEWLOWERING-LABEL: zt0_new_caller_abi_routine_callee:244; CHECK-NEWLOWERING: // %bb.0:245; CHECK-NEWLOWERING-NEXT: sub sp, sp, #80246; CHECK-NEWLOWERING-NEXT: str x30, [sp, #64] // 8-byte Spill247; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0248; CHECK-NEWLOWERING-NEXT: cbz x8, .LBB7_2249; CHECK-NEWLOWERING-NEXT: // %bb.1:250; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save251; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr252; CHECK-NEWLOWERING-NEXT: zero { zt0 }253; CHECK-NEWLOWERING-NEXT: .LBB7_2:254; CHECK-NEWLOWERING-NEXT: smstart za255; CHECK-NEWLOWERING-NEXT: mov x8, sp256; CHECK-NEWLOWERING-NEXT: str zt0, [x8]257; CHECK-NEWLOWERING-NEXT: smstop za258; CHECK-NEWLOWERING-NEXT: bl __arm_sme_state259; CHECK-NEWLOWERING-NEXT: ldr x30, [sp, #64] // 8-byte Reload260; CHECK-NEWLOWERING-NEXT: add sp, sp, #80261; CHECK-NEWLOWERING-NEXT: ret262 %res = call {i64, i64} @__arm_sme_state()263 %res.0 = extractvalue {i64, i64} %res, 0264 ret i64 %res.0265}266 267declare {i64, i64} @__arm_sme_state()268 269;270; New-ZA Caller271;272 273; Expect commit of lazy-save if ZA is dormant274; Expect smstart ZA & clear ZT0275; Before return, expect smstop ZA276define void @zt0_new_caller(ptr %callee) "aarch64_new_zt0" nounwind {277; CHECK-LABEL: zt0_new_caller:278; CHECK: // %bb.0: // %prelude279; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill280; CHECK-NEXT: mrs x8, TPIDR2_EL0281; CHECK-NEXT: cbz x8, .LBB8_2282; CHECK-NEXT: // %bb.1: // %save.za283; CHECK-NEXT: bl __arm_tpidr2_save284; CHECK-NEXT: msr TPIDR2_EL0, xzr285; CHECK-NEXT: .LBB8_2:286; CHECK-NEXT: smstart za287; CHECK-NEXT: zero { zt0 }288; CHECK-NEXT: blr x0289; CHECK-NEXT: smstop za290; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload291; CHECK-NEXT: ret292;293; CHECK-NEWLOWERING-LABEL: zt0_new_caller:294; CHECK-NEWLOWERING: // %bb.0:295; CHECK-NEWLOWERING-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill296; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0297; CHECK-NEWLOWERING-NEXT: cbz x8, .LBB8_2298; CHECK-NEWLOWERING-NEXT: // %bb.1:299; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save300; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr301; CHECK-NEWLOWERING-NEXT: zero { zt0 }302; CHECK-NEWLOWERING-NEXT: .LBB8_2:303; CHECK-NEWLOWERING-NEXT: smstart za304; CHECK-NEWLOWERING-NEXT: blr x0305; CHECK-NEWLOWERING-NEXT: smstop za306; CHECK-NEWLOWERING-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload307; CHECK-NEWLOWERING-NEXT: ret308 call void %callee() "aarch64_in_zt0";309 ret void;310}311 312; Expect commit of lazy-save if ZA is dormant313; Expect smstart ZA, clear ZA & clear ZT0314; Before return, expect smstop ZA315define void @new_za_zt0_caller(ptr %callee) "aarch64_new_za" "aarch64_new_zt0" nounwind {316; CHECK-LABEL: new_za_zt0_caller:317; CHECK: // %bb.0: // %prelude318; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill319; CHECK-NEXT: mrs x8, TPIDR2_EL0320; CHECK-NEXT: cbz x8, .LBB9_2321; CHECK-NEXT: // %bb.1: // %save.za322; CHECK-NEXT: bl __arm_tpidr2_save323; CHECK-NEXT: msr TPIDR2_EL0, xzr324; CHECK-NEXT: .LBB9_2:325; CHECK-NEXT: smstart za326; CHECK-NEXT: zero {za}327; CHECK-NEXT: zero { zt0 }328; CHECK-NEXT: blr x0329; CHECK-NEXT: smstop za330; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload331; CHECK-NEXT: ret332;333; CHECK-NEWLOWERING-LABEL: new_za_zt0_caller:334; CHECK-NEWLOWERING: // %bb.0:335; CHECK-NEWLOWERING-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill336; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0337; CHECK-NEWLOWERING-NEXT: cbz x8, .LBB9_2338; CHECK-NEWLOWERING-NEXT: // %bb.1:339; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save340; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr341; CHECK-NEWLOWERING-NEXT: zero {za}342; CHECK-NEWLOWERING-NEXT: zero { zt0 }343; CHECK-NEWLOWERING-NEXT: .LBB9_2:344; CHECK-NEWLOWERING-NEXT: smstart za345; CHECK-NEWLOWERING-NEXT: blr x0346; CHECK-NEWLOWERING-NEXT: smstop za347; CHECK-NEWLOWERING-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload348; CHECK-NEWLOWERING-NEXT: ret349 call void %callee() "aarch64_inout_za" "aarch64_in_zt0";350 ret void;351}352 353; Expect clear ZA on entry354define void @new_za_shared_zt0_caller(ptr %callee) "aarch64_new_za" "aarch64_in_zt0" nounwind {355; CHECK-COMMON-LABEL: new_za_shared_zt0_caller:356; CHECK-COMMON: // %bb.0:357; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill358; CHECK-COMMON-NEXT: zero {za}359; CHECK-COMMON-NEXT: blr x0360; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload361; CHECK-COMMON-NEXT: ret362 call void %callee() "aarch64_inout_za" "aarch64_in_zt0";363 ret void;364}365 366; Expect clear ZT0 on entry367define void @shared_za_new_zt0(ptr %callee) "aarch64_inout_za" "aarch64_new_zt0" nounwind {368; CHECK-COMMON-LABEL: shared_za_new_zt0:369; CHECK-COMMON: // %bb.0:370; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill371; CHECK-COMMON-NEXT: zero { zt0 }372; CHECK-COMMON-NEXT: blr x0373; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload374; CHECK-COMMON-NEXT: ret375 call void %callee() "aarch64_inout_za" "aarch64_in_zt0";376 ret void;377}378 379 380define void @zt0_multiple_private_za_calls(ptr %callee) "aarch64_in_zt0" nounwind {381; CHECK-LABEL: zt0_multiple_private_za_calls:382; CHECK: // %bb.0:383; CHECK-NEXT: sub sp, sp, #96384; CHECK-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill385; CHECK-NEXT: mov x20, sp386; CHECK-NEXT: mov x19, x0387; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill388; CHECK-NEXT: str zt0, [x20]389; CHECK-NEXT: smstop za390; CHECK-NEXT: blr x0391; CHECK-NEXT: smstart za392; CHECK-NEXT: ldr zt0, [x20]393; CHECK-NEXT: str zt0, [x20]394; CHECK-NEXT: smstop za395; CHECK-NEXT: blr x19396; CHECK-NEXT: smstart za397; CHECK-NEXT: ldr zt0, [x20]398; CHECK-NEXT: str zt0, [x20]399; CHECK-NEXT: smstop za400; CHECK-NEXT: blr x19401; CHECK-NEXT: smstart za402; CHECK-NEXT: ldr zt0, [x20]403; CHECK-NEXT: str zt0, [x20]404; CHECK-NEXT: smstop za405; CHECK-NEXT: blr x19406; CHECK-NEXT: smstart za407; CHECK-NEXT: ldr zt0, [x20]408; CHECK-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload409; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload410; CHECK-NEXT: add sp, sp, #96411; CHECK-NEXT: ret412;413; CHECK-NEWLOWERING-LABEL: zt0_multiple_private_za_calls:414; CHECK-NEWLOWERING: // %bb.0:415; CHECK-NEWLOWERING-NEXT: sub sp, sp, #96416; CHECK-NEWLOWERING-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill417; CHECK-NEWLOWERING-NEXT: mov x20, sp418; CHECK-NEWLOWERING-NEXT: mov x19, x0419; CHECK-NEWLOWERING-NEXT: str x30, [sp, #64] // 8-byte Spill420; CHECK-NEWLOWERING-NEXT: str zt0, [x20]421; CHECK-NEWLOWERING-NEXT: smstop za422; CHECK-NEWLOWERING-NEXT: blr x0423; CHECK-NEWLOWERING-NEXT: blr x19424; CHECK-NEWLOWERING-NEXT: blr x19425; CHECK-NEWLOWERING-NEXT: blr x19426; CHECK-NEWLOWERING-NEXT: smstart za427; CHECK-NEWLOWERING-NEXT: ldr zt0, [x20]428; CHECK-NEWLOWERING-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload429; CHECK-NEWLOWERING-NEXT: ldr x30, [sp, #64] // 8-byte Reload430; CHECK-NEWLOWERING-NEXT: add sp, sp, #96431; CHECK-NEWLOWERING-NEXT: ret432 call void %callee()433 call void %callee()434 call void %callee()435 call void %callee()436 ret void437}438 439define void @disable_tailcallopt(ptr %callee) "aarch64_inout_zt0" nounwind {440; CHECK-COMMON-LABEL: disable_tailcallopt:441; CHECK-COMMON: // %bb.0:442; CHECK-COMMON-NEXT: sub sp, sp, #80443; CHECK-COMMON-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill444; CHECK-COMMON-NEXT: mov x19, sp445; CHECK-COMMON-NEXT: str zt0, [x19]446; CHECK-COMMON-NEXT: smstop za447; CHECK-COMMON-NEXT: blr x0448; CHECK-COMMON-NEXT: smstart za449; CHECK-COMMON-NEXT: ldr zt0, [x19]450; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload451; CHECK-COMMON-NEXT: add sp, sp, #80452; CHECK-COMMON-NEXT: ret453 tail call void %callee()454 ret void455}456