431 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme -verify-machineinstrs < %s | FileCheck %s3 4; This file tests the following combinations related to streaming-enabled functions:5; [ ] N -> S (Normal -> Streaming)6; [ ] S -> N (Streaming -> Normal)7; [ ] S -> S (Streaming -> Streaming)8; [ ] S -> SC (Streaming -> Streaming-compatible)9;10; The following combination is tested in sme-streaming-compatible-interface.ll11; [ ] SC -> S (Streaming-compatible -> Streaming)12 13declare void @normal_callee()14declare void @streaming_callee() "aarch64_pstate_sm_enabled"15declare void @streaming_compatible_callee() "aarch64_pstate_sm_compatible"16 17; [x] N -> S18; [ ] S -> N19; [ ] S -> S20; [ ] S -> SC21define void @normal_caller_streaming_callee() nounwind {22; CHECK-LABEL: normal_caller_streaming_callee:23; CHECK: // %bb.0:24; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill25; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill26; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill27; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill28; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill29; CHECK-NEXT: smstart sm30; CHECK-NEXT: bl streaming_callee31; CHECK-NEXT: smstop sm32; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload33; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload34; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload35; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload36; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload37; CHECK-NEXT: ret38 call void @streaming_callee()39 ret void;40}41 42; [ ] N -> S43; [x] S -> N44; [ ] S -> S45; [ ] S -> SC46define void @streaming_caller_normal_callee() nounwind "aarch64_pstate_sm_enabled" {47; CHECK-LABEL: streaming_caller_normal_callee:48; CHECK: // %bb.0:49; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill50; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill51; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill52; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill53; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill54; CHECK-NEXT: smstop sm55; CHECK-NEXT: bl normal_callee56; CHECK-NEXT: smstart sm57; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload58; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload59; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload60; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload61; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload62; CHECK-NEXT: ret63 call void @normal_callee()64 ret void;65}66 67; [ ] N -> S68; [ ] S -> N69; [x] S -> S70; [ ] S -> SC71define void @streaming_caller_streaming_callee() nounwind "aarch64_pstate_sm_enabled" {72; CHECK-LABEL: streaming_caller_streaming_callee:73; CHECK: // %bb.0:74; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill75; CHECK-NEXT: bl streaming_callee76; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload77; CHECK-NEXT: ret78 call void @streaming_callee()79 ret void;80}81 82; [ ] N -> S83; [ ] S -> N84; [ ] S -> S85; [x] S -> SC86define void @streaming_caller_streaming_compatible_callee() nounwind "aarch64_pstate_sm_enabled" {87; CHECK-LABEL: streaming_caller_streaming_compatible_callee:88; CHECK: // %bb.0:89; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill90; CHECK-NEXT: bl streaming_compatible_callee91; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload92; CHECK-NEXT: ret93 call void @streaming_compatible_callee()94 ret void;95}96 97;98; Handle special cases here.99;100 101; Call to function-pointer (with attribute)102define void @call_to_function_pointer_streaming_enabled(ptr %p) nounwind {103; CHECK-LABEL: call_to_function_pointer_streaming_enabled:104; CHECK: // %bb.0:105; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill106; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill107; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill108; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill109; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill110; CHECK-NEXT: smstart sm111; CHECK-NEXT: blr x0112; CHECK-NEXT: smstop sm113; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload114; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload115; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload116; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload117; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload118; CHECK-NEXT: ret119 call void %p() "aarch64_pstate_sm_enabled"120 ret void121}122 123; Ensure NEON registers are preserved correctly.124define <4 x i32> @smstart_clobber_simdfp(<4 x i32> %x) nounwind {125; CHECK-LABEL: smstart_clobber_simdfp:126; CHECK: // %bb.0:127; CHECK-NEXT: sub sp, sp, #96128; CHECK-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill129; CHECK-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill130; CHECK-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill131; CHECK-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill132; CHECK-NEXT: str x30, [sp, #80] // 8-byte Spill133; CHECK-NEXT: str q0, [sp] // 16-byte Spill134; CHECK-NEXT: smstart sm135; CHECK-NEXT: bl streaming_callee136; CHECK-NEXT: smstop sm137; CHECK-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload138; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload139; CHECK-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload140; CHECK-NEXT: ldr x30, [sp, #80] // 8-byte Reload141; CHECK-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload142; CHECK-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload143; CHECK-NEXT: add sp, sp, #96144; CHECK-NEXT: ret145 call void @streaming_callee()146 ret <4 x i32> %x;147}148 149; Ensure SVE registers are preserved correctly.150define <vscale x 4 x i32> @smstart_clobber_sve(<vscale x 4 x i32> %x) nounwind {151; CHECK-LABEL: smstart_clobber_sve:152; CHECK: // %bb.0:153; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill154; CHECK-NEXT: addvl sp, sp, #-18155; CHECK-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill156; CHECK-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill157; CHECK-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill158; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill159; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill160; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill161; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill162; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill163; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill164; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill165; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill166; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill167; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill168; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill169; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill170; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill171; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill172; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill173; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill174; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill175; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill176; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill177; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill178; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill179; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill180; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill181; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill182; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill183; CHECK-NEXT: addvl sp, sp, #-1184; CHECK-NEXT: str z0, [sp] // 16-byte Folded Spill185; CHECK-NEXT: smstart sm186; CHECK-NEXT: bl streaming_callee187; CHECK-NEXT: smstop sm188; CHECK-NEXT: ldr z0, [sp] // 16-byte Folded Reload189; CHECK-NEXT: addvl sp, sp, #1190; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload191; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload192; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload193; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload194; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload195; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload196; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload197; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload198; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload199; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload200; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload201; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload202; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload203; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload204; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload205; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload206; CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload207; CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload208; CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload209; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload210; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload211; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload212; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload213; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload214; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload215; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload216; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload217; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload218; CHECK-NEXT: addvl sp, sp, #18219; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload220; CHECK-NEXT: ret221 call void @streaming_callee()222 ret <vscale x 4 x i32> %x;223}224 225; Call streaming callee twice; there should be no spills/fills between the two226; calls since the registers should have already been clobbered.227define <vscale x 4 x i32> @smstart_clobber_sve_duplicate(<vscale x 4 x i32> %x) nounwind {228; CHECK-LABEL: smstart_clobber_sve_duplicate:229; CHECK: // %bb.0:230; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill231; CHECK-NEXT: addvl sp, sp, #-18232; CHECK-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill233; CHECK-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill234; CHECK-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill235; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill236; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill237; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill238; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill239; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill240; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill241; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill242; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill243; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill244; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill245; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill246; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill247; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill248; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill249; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill250; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill251; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill252; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill253; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill254; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill255; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill256; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill257; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill258; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill259; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill260; CHECK-NEXT: addvl sp, sp, #-1261; CHECK-NEXT: str z0, [sp] // 16-byte Folded Spill262; CHECK-NEXT: smstart sm263; CHECK-NEXT: bl streaming_callee264; CHECK-NEXT: bl streaming_callee265; CHECK-NEXT: smstop sm266; CHECK-NEXT: ldr z0, [sp] // 16-byte Folded Reload267; CHECK-NEXT: addvl sp, sp, #1268; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload269; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload270; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload271; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload272; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload273; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload274; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload275; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload276; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload277; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload278; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload279; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload280; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload281; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload282; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload283; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload284; CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload285; CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload286; CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload287; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload288; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload289; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload290; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload291; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload292; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload293; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload294; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload295; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload296; CHECK-NEXT: addvl sp, sp, #18297; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload298; CHECK-NEXT: ret299 call void @streaming_callee()300 call void @streaming_callee()301 ret <vscale x 4 x i32> %x;302}303 304; Ensure smstart is not removed, because call to llvm.cos is not part of a chain.305define double @call_to_intrinsic_without_chain(double %x) nounwind "aarch64_pstate_sm_enabled" {306; CHECK-LABEL: call_to_intrinsic_without_chain:307; CHECK: // %bb.0: // %entry308; CHECK-NEXT: sub sp, sp, #96309; CHECK-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill310; CHECK-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill311; CHECK-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill312; CHECK-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill313; CHECK-NEXT: str x30, [sp, #80] // 8-byte Spill314; CHECK-NEXT: stp d0, d0, [sp] // 16-byte Folded Spill315; CHECK-NEXT: smstop sm316; CHECK-NEXT: ldr d0, [sp] // 8-byte Reload317; CHECK-NEXT: bl cos318; CHECK-NEXT: str d0, [sp] // 8-byte Spill319; CHECK-NEXT: smstart sm320; CHECK-NEXT: ldp d1, d0, [sp] // 16-byte Folded Reload321; CHECK-NEXT: ldr x30, [sp, #80] // 8-byte Reload322; CHECK-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload323; CHECK-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload324; CHECK-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload325; CHECK-NEXT: fadd d0, d1, d0326; CHECK-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload327; CHECK-NEXT: add sp, sp, #96328; CHECK-NEXT: ret329entry:330 %res = call fast double @llvm.cos.f64(double %x)331 %res.fadd = fadd fast double %res, %x332 ret double %res.fadd333}334 335declare double @llvm.cos.f64(double)336 337; Ensure that tail call optimization is disabled when the streaming mode338; doesn't match.339define void @disable_tailcallopt() nounwind {340; CHECK-LABEL: disable_tailcallopt:341; CHECK: // %bb.0:342; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill343; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill344; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill345; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill346; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill347; CHECK-NEXT: smstart sm348; CHECK-NEXT: bl streaming_callee349; CHECK-NEXT: smstop sm350; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload351; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload352; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload353; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload354; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload355; CHECK-NEXT: ret356 tail call void @streaming_callee()357 ret void;358}359 360define i8 @call_to_non_streaming_pass_sve_objects(ptr nocapture noundef readnone %ptr) #0 {361; CHECK-LABEL: call_to_non_streaming_pass_sve_objects:362; CHECK: // %bb.0: // %entry363; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill364; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill365; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill366; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill367; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill368; CHECK-NEXT: addvl sp, sp, #-3369; CHECK-NEXT: rdsvl x8, #1370; CHECK-NEXT: addvl x0, sp, #2371; CHECK-NEXT: addvl x1, sp, #1372; CHECK-NEXT: lsr x3, x8, #3373; CHECK-NEXT: mov x2, sp374; CHECK-NEXT: smstop sm375; CHECK-NEXT: bl foo376; CHECK-NEXT: smstart sm377; CHECK-NEXT: addvl x8, sp, #2378; CHECK-NEXT: ldrb w0, [x8]379; CHECK-NEXT: addvl sp, sp, #3380; CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload381; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload382; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload383; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload384; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload385; CHECK-NEXT: ret386entry:387 %Data1 = alloca <vscale x 16 x i8>, align 16388 %Data2 = alloca <vscale x 16 x i8>, align 16389 %Data3 = alloca <vscale x 16 x i8>, align 16390 %0 = tail call i64 @llvm.aarch64.sme.cntsd()391 call void @foo(ptr noundef nonnull %Data1, ptr noundef nonnull %Data2, ptr noundef nonnull %Data3, i64 noundef %0)392 %1 = load <vscale x 16 x i8>, ptr %Data1, align 16393 %vecext = extractelement <vscale x 16 x i8> %1, i64 0394 ret i8 %vecext395}396 397define void @call_to_non_streaming_pass_args(ptr nocapture noundef readnone %ptr, i64 %long1, i64 %long2, i32 %int1, i32 %int2, float %float1, float %float2, double %double1, double %double2) #0 {398; CHECK-LABEL: call_to_non_streaming_pass_args:399; CHECK: // %bb.0: // %entry400; CHECK-NEXT: sub sp, sp, #112401; CHECK-NEXT: stp d15, d14, [sp, #32] // 16-byte Folded Spill402; CHECK-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill403; CHECK-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill404; CHECK-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill405; CHECK-NEXT: str x30, [sp, #96] // 8-byte Spill406; CHECK-NEXT: stp d2, d3, [sp, #16] // 16-byte Folded Spill407; CHECK-NEXT: stp s0, s1, [sp, #8] // 8-byte Folded Spill408; CHECK-NEXT: smstop sm409; CHECK-NEXT: ldp s0, s1, [sp, #8] // 8-byte Folded Reload410; CHECK-NEXT: ldp d2, d3, [sp, #16] // 16-byte Folded Reload411; CHECK-NEXT: bl bar412; CHECK-NEXT: smstart sm413; CHECK-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload414; CHECK-NEXT: ldr x30, [sp, #96] // 8-byte Reload415; CHECK-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload416; CHECK-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload417; CHECK-NEXT: ldp d15, d14, [sp, #32] // 16-byte Folded Reload418; CHECK-NEXT: add sp, sp, #112419; CHECK-NEXT: ret420entry:421 call void @bar(ptr noundef nonnull %ptr, i64 %long1, i64 %long2, i32 %int1, i32 %int2, float %float1, float %float2, double %double1, double %double2)422 ret void423}424 425declare i64 @llvm.aarch64.sme.cntsd()426 427declare void @foo(ptr noundef, ptr noundef, ptr noundef, i64 noundef)428declare void @bar(ptr noundef, i64 noundef, i64 noundef, i32 noundef, i32 noundef, float noundef, float noundef, double noundef, double noundef)429 430attributes #0 = { nounwind vscale_range(1,16) "aarch64_pstate_sm_enabled" }431