brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.6 KiB · 944c131 Raw
512 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 -verify-machineinstrs -mattr=+sve -mattr=+sme < %s | FileCheck %s3 4; This file tests the following combinations related to streaming-enabled functions:5; [ ] N  ->  SC    (Normal -> Streaming-compatible)6; [ ] SC  ->  N    (Streaming-compatible -> Normal)7; [ ] SC  ->  S    (Streaming-compatible -> Streaming)8; [ ] SC  ->  SC   (Streaming-compatible -> Streaming-compatible)9;10; The following combination is tested in sme-streaming-interface.ll11; [ ] S  ->  SC    (Streaming -> Streaming-compatible)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   ->  SC   (Normal -> Streaming-compatible)18; [ ] SC  ->  N    (Streaming-compatible -> Normal)19; [ ] SC  ->  S    (Streaming-compatible -> Streaming)20; [ ] SC  ->  SC   (Streaming-compatible -> Streaming-compatible)21define void @normal_caller_streaming_compatible_callee() nounwind {22; CHECK-LABEL: normal_caller_streaming_compatible_callee:23; CHECK:       // %bb.0:24; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill25; CHECK-NEXT:    bl streaming_compatible_callee26; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload27; CHECK-NEXT:    ret28  call void @streaming_compatible_callee();29  ret void;30}31 32; [ ] N   ->  SC   (Normal -> Streaming-compatible)33; [x] SC  ->  N    (Streaming-compatible -> Normal)34; [ ] SC  ->  S    (Streaming-compatible -> Streaming)35; [ ] SC  ->  SC   (Streaming-compatible -> Streaming-compatible)36define void @streaming_compatible_caller_normal_callee() "aarch64_pstate_sm_compatible" nounwind {37; CHECK-LABEL: streaming_compatible_caller_normal_callee:38; CHECK:       // %bb.0:39; CHECK-NEXT:    stp d15, d14, [sp, #-80]! // 16-byte Folded Spill40; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill41; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill42; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill43; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill44; CHECK-NEXT:    mrs x19, SVCR45; CHECK-NEXT:    tbz w19, #0, .LBB1_246; CHECK-NEXT:  // %bb.1:47; CHECK-NEXT:    smstop sm48; CHECK-NEXT:  .LBB1_2:49; CHECK-NEXT:    bl normal_callee50; CHECK-NEXT:    tbz w19, #0, .LBB1_451; CHECK-NEXT:  // %bb.3:52; CHECK-NEXT:    smstart sm53; CHECK-NEXT:  .LBB1_4:54; CHECK-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload55; CHECK-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload56; CHECK-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload57; CHECK-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload58; CHECK-NEXT:    ldp d15, d14, [sp], #80 // 16-byte Folded Reload59; CHECK-NEXT:    ret60 61  call void @normal_callee();62  ret void;63}64 65; Streaming Compatible Caller, Streaming Callee66 67; [ ] N   ->  SC   (Normal -> Streaming-compatible)68; [ ] SC  ->  N    (Streaming-compatible -> Normal)69; [x] SC  ->  S    (Streaming-compatible -> Streaming)70; [ ] SC  ->  SC   (Streaming-compatible -> Streaming-compatible)71define void @streaming_compatible_caller_streaming_callee() "aarch64_pstate_sm_compatible" nounwind {72; CHECK-LABEL: streaming_compatible_caller_streaming_callee:73; CHECK:       // %bb.0:74; CHECK-NEXT:    stp d15, d14, [sp, #-80]! // 16-byte Folded Spill75; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill76; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill77; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill78; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill79; CHECK-NEXT:    mrs x19, SVCR80; CHECK-NEXT:    tbnz w19, #0, .LBB2_281; CHECK-NEXT:  // %bb.1:82; CHECK-NEXT:    smstart sm83; CHECK-NEXT:  .LBB2_2:84; CHECK-NEXT:    bl streaming_callee85; CHECK-NEXT:    tbnz w19, #0, .LBB2_486; CHECK-NEXT:  // %bb.3:87; CHECK-NEXT:    smstop sm88; CHECK-NEXT:  .LBB2_4:89; CHECK-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload90; CHECK-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload91; CHECK-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload92; CHECK-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload93; CHECK-NEXT:    ldp d15, d14, [sp], #80 // 16-byte Folded Reload94; CHECK-NEXT:    ret95 96  call void @streaming_callee();97  ret void;98}99 100; [ ] N  ->  SC    (Normal -> Streaming-compatible)101; [ ] SC  ->  N    (Streaming-compatible -> Normal)102; [ ] SC  ->  S    (Streaming-compatible -> Streaming)103; [x] SC  ->  SC   (Streaming-compatible -> Streaming-compatible)104define void @streaming_compatible_caller_and_callee() "aarch64_pstate_sm_compatible" nounwind {105; CHECK-LABEL: streaming_compatible_caller_and_callee:106; CHECK:       // %bb.0:107; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill108; CHECK-NEXT:    bl streaming_compatible_callee109; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload110; CHECK-NEXT:    ret111 112  call void @streaming_compatible_callee();113  ret void;114}115 116 117;118; Handle special cases here.119;120 121define <2 x double> @streaming_compatible_with_neon_vectors(<2 x double> %arg) "aarch64_pstate_sm_compatible" nounwind {122; CHECK-LABEL: streaming_compatible_with_neon_vectors:123; CHECK:       // %bb.0:124; CHECK-NEXT:    stp d15, d14, [sp, #-96]! // 16-byte Folded Spill125; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill126; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill127; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill128; CHECK-NEXT:    str x29, [sp, #64] // 8-byte Spill129; CHECK-NEXT:    stp x30, x19, [sp, #80] // 16-byte Folded Spill130; CHECK-NEXT:    sub sp, sp, #16131; CHECK-NEXT:    addvl sp, sp, #-1132; CHECK-NEXT:    str q0, [sp] // 16-byte Spill133; CHECK-NEXT:    mrs x19, SVCR134; CHECK-NEXT:    add x8, sp, #16135; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0136; CHECK-NEXT:    str z0, [x8] // 16-byte Folded Spill137; CHECK-NEXT:    tbz w19, #0, .LBB4_2138; CHECK-NEXT:  // %bb.1:139; CHECK-NEXT:    smstop sm140; CHECK-NEXT:  .LBB4_2:141; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload142; CHECK-NEXT:    bl normal_callee_vec_arg143; CHECK-NEXT:    str q0, [sp] // 16-byte Spill144; CHECK-NEXT:    tbz w19, #0, .LBB4_4145; CHECK-NEXT:  // %bb.3:146; CHECK-NEXT:    smstart sm147; CHECK-NEXT:  .LBB4_4:148; CHECK-NEXT:    add x8, sp, #16149; CHECK-NEXT:    ptrue p0.d, vl2150; CHECK-NEXT:    ldr q0, [sp] // 16-byte Reload151; CHECK-NEXT:    ldr z1, [x8] // 16-byte Folded Reload152; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0153; CHECK-NEXT:    fadd z0.d, p0/m, z0.d, z1.d154; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0155; CHECK-NEXT:    addvl sp, sp, #1156; CHECK-NEXT:    add sp, sp, #16157; CHECK-NEXT:    ldp x30, x19, [sp, #80] // 16-byte Folded Reload158; CHECK-NEXT:    ldr x29, [sp, #64] // 8-byte Reload159; CHECK-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload160; CHECK-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload161; CHECK-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload162; CHECK-NEXT:    ldp d15, d14, [sp], #96 // 16-byte Folded Reload163; CHECK-NEXT:    ret164  %res = call <2 x double> @normal_callee_vec_arg(<2 x double> %arg)165  %fadd = fadd <2 x double> %res, %arg166  ret <2 x double> %fadd167}168declare <2 x double> @normal_callee_vec_arg(<2 x double>)169 170define <vscale x 2 x double> @streaming_compatible_with_scalable_vectors(<vscale x 2 x double> %arg) "aarch64_pstate_sm_compatible" nounwind {171; CHECK-LABEL: streaming_compatible_with_scalable_vectors:172; CHECK:       // %bb.0:173; CHECK-NEXT:    str x29, [sp, #-32]! // 8-byte Folded Spill174; CHECK-NEXT:    stp x30, x19, [sp, #16] // 16-byte Folded Spill175; CHECK-NEXT:    addvl sp, sp, #-18176; CHECK-NEXT:    str p15, [sp, #4, mul vl] // 2-byte Spill177; CHECK-NEXT:    str p14, [sp, #5, mul vl] // 2-byte Spill178; CHECK-NEXT:    str p13, [sp, #6, mul vl] // 2-byte Spill179; CHECK-NEXT:    str p12, [sp, #7, mul vl] // 2-byte Spill180; CHECK-NEXT:    str p11, [sp, #8, mul vl] // 2-byte Spill181; CHECK-NEXT:    str p10, [sp, #9, mul vl] // 2-byte Spill182; CHECK-NEXT:    str p9, [sp, #10, mul vl] // 2-byte Spill183; CHECK-NEXT:    str p8, [sp, #11, mul vl] // 2-byte Spill184; CHECK-NEXT:    str p7, [sp, #12, mul vl] // 2-byte Spill185; CHECK-NEXT:    str p6, [sp, #13, mul vl] // 2-byte Spill186; CHECK-NEXT:    str p5, [sp, #14, mul vl] // 2-byte Spill187; CHECK-NEXT:    str p4, [sp, #15, mul vl] // 2-byte Spill188; CHECK-NEXT:    str z23, [sp, #2, mul vl] // 16-byte Folded Spill189; CHECK-NEXT:    str z22, [sp, #3, mul vl] // 16-byte Folded Spill190; CHECK-NEXT:    str z21, [sp, #4, mul vl] // 16-byte Folded Spill191; CHECK-NEXT:    str z20, [sp, #5, mul vl] // 16-byte Folded Spill192; CHECK-NEXT:    str z19, [sp, #6, mul vl] // 16-byte Folded Spill193; CHECK-NEXT:    str z18, [sp, #7, mul vl] // 16-byte Folded Spill194; CHECK-NEXT:    str z17, [sp, #8, mul vl] // 16-byte Folded Spill195; CHECK-NEXT:    str z16, [sp, #9, mul vl] // 16-byte Folded Spill196; CHECK-NEXT:    str z15, [sp, #10, mul vl] // 16-byte Folded Spill197; CHECK-NEXT:    str z14, [sp, #11, mul vl] // 16-byte Folded Spill198; CHECK-NEXT:    str z13, [sp, #12, mul vl] // 16-byte Folded Spill199; CHECK-NEXT:    str z12, [sp, #13, mul vl] // 16-byte Folded Spill200; CHECK-NEXT:    str z11, [sp, #14, mul vl] // 16-byte Folded Spill201; CHECK-NEXT:    str z10, [sp, #15, mul vl] // 16-byte Folded Spill202; CHECK-NEXT:    str z9, [sp, #16, mul vl] // 16-byte Folded Spill203; CHECK-NEXT:    str z8, [sp, #17, mul vl] // 16-byte Folded Spill204; CHECK-NEXT:    addvl sp, sp, #-2205; CHECK-NEXT:    str z0, [sp, #1, mul vl] // 16-byte Folded Spill206; CHECK-NEXT:    mrs x19, SVCR207; CHECK-NEXT:    tbz w19, #0, .LBB5_2208; CHECK-NEXT:  // %bb.1:209; CHECK-NEXT:    smstop sm210; CHECK-NEXT:  .LBB5_2:211; CHECK-NEXT:    rdvl x8, #1212; CHECK-NEXT:    addsvl x8, x8, #-1213; CHECK-NEXT:    cbz x8, .LBB5_4214; CHECK-NEXT:  // %bb.3:215; CHECK-NEXT:    brk #0x1216; CHECK-NEXT:  .LBB5_4:217; CHECK-NEXT:    ldr z0, [sp, #1, mul vl] // 16-byte Folded Reload218; CHECK-NEXT:    bl normal_callee_scalable_vec_arg219; CHECK-NEXT:    str z0, [sp] // 16-byte Folded Spill220; CHECK-NEXT:    tbz w19, #0, .LBB5_6221; CHECK-NEXT:  // %bb.5:222; CHECK-NEXT:    smstart sm223; CHECK-NEXT:  .LBB5_6:224; CHECK-NEXT:    ldr z0, [sp, #1, mul vl] // 16-byte Folded Reload225; CHECK-NEXT:    ldr z1, [sp] // 16-byte Folded Reload226; CHECK-NEXT:    fadd z0.d, z1.d, z0.d227; CHECK-NEXT:    addvl sp, sp, #2228; CHECK-NEXT:    ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload229; CHECK-NEXT:    ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload230; CHECK-NEXT:    ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload231; CHECK-NEXT:    ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload232; CHECK-NEXT:    ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload233; CHECK-NEXT:    ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload234; CHECK-NEXT:    ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload235; CHECK-NEXT:    ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload236; CHECK-NEXT:    ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload237; CHECK-NEXT:    ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload238; CHECK-NEXT:    ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload239; CHECK-NEXT:    ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload240; CHECK-NEXT:    ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload241; CHECK-NEXT:    ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload242; CHECK-NEXT:    ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload243; CHECK-NEXT:    ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload244; CHECK-NEXT:    ldr p15, [sp, #4, mul vl] // 2-byte Reload245; CHECK-NEXT:    ldr p14, [sp, #5, mul vl] // 2-byte Reload246; CHECK-NEXT:    ldr p13, [sp, #6, mul vl] // 2-byte Reload247; CHECK-NEXT:    ldr p12, [sp, #7, mul vl] // 2-byte Reload248; CHECK-NEXT:    ldr p11, [sp, #8, mul vl] // 2-byte Reload249; CHECK-NEXT:    ldr p10, [sp, #9, mul vl] // 2-byte Reload250; CHECK-NEXT:    ldr p9, [sp, #10, mul vl] // 2-byte Reload251; CHECK-NEXT:    ldr p8, [sp, #11, mul vl] // 2-byte Reload252; CHECK-NEXT:    ldr p7, [sp, #12, mul vl] // 2-byte Reload253; CHECK-NEXT:    ldr p6, [sp, #13, mul vl] // 2-byte Reload254; CHECK-NEXT:    ldr p5, [sp, #14, mul vl] // 2-byte Reload255; CHECK-NEXT:    ldr p4, [sp, #15, mul vl] // 2-byte Reload256; CHECK-NEXT:    addvl sp, sp, #18257; CHECK-NEXT:    ldp x30, x19, [sp, #16] // 16-byte Folded Reload258; CHECK-NEXT:    ldr x29, [sp], #32 // 8-byte Folded Reload259; CHECK-NEXT:    ret260  %res = call <vscale x 2 x double> @normal_callee_scalable_vec_arg(<vscale x 2 x double> %arg)261  %fadd = fadd <vscale x 2 x double> %res, %arg262  ret <vscale x 2 x double> %fadd263}264 265declare <vscale x 2 x double> @normal_callee_scalable_vec_arg(<vscale x 2 x double>)266 267define <vscale x 2 x i1> @streaming_compatible_with_predicate_vectors(<vscale x 2 x i1> %arg) "aarch64_pstate_sm_compatible" nounwind {268; CHECK-LABEL: streaming_compatible_with_predicate_vectors:269; CHECK:       // %bb.0:270; CHECK-NEXT:    str x29, [sp, #-32]! // 8-byte Folded Spill271; CHECK-NEXT:    stp x30, x19, [sp, #16] // 16-byte Folded Spill272; CHECK-NEXT:    addvl sp, sp, #-18273; CHECK-NEXT:    str p15, [sp, #4, mul vl] // 2-byte Spill274; CHECK-NEXT:    str p14, [sp, #5, mul vl] // 2-byte Spill275; CHECK-NEXT:    str p13, [sp, #6, mul vl] // 2-byte Spill276; CHECK-NEXT:    str p12, [sp, #7, mul vl] // 2-byte Spill277; CHECK-NEXT:    str p11, [sp, #8, mul vl] // 2-byte Spill278; CHECK-NEXT:    str p10, [sp, #9, mul vl] // 2-byte Spill279; CHECK-NEXT:    str p9, [sp, #10, mul vl] // 2-byte Spill280; CHECK-NEXT:    str p8, [sp, #11, mul vl] // 2-byte Spill281; CHECK-NEXT:    str p7, [sp, #12, mul vl] // 2-byte Spill282; CHECK-NEXT:    str p6, [sp, #13, mul vl] // 2-byte Spill283; CHECK-NEXT:    str p5, [sp, #14, mul vl] // 2-byte Spill284; CHECK-NEXT:    str p4, [sp, #15, mul vl] // 2-byte Spill285; CHECK-NEXT:    str z23, [sp, #2, mul vl] // 16-byte Folded Spill286; CHECK-NEXT:    str z22, [sp, #3, mul vl] // 16-byte Folded Spill287; CHECK-NEXT:    str z21, [sp, #4, mul vl] // 16-byte Folded Spill288; CHECK-NEXT:    str z20, [sp, #5, mul vl] // 16-byte Folded Spill289; CHECK-NEXT:    str z19, [sp, #6, mul vl] // 16-byte Folded Spill290; CHECK-NEXT:    str z18, [sp, #7, mul vl] // 16-byte Folded Spill291; CHECK-NEXT:    str z17, [sp, #8, mul vl] // 16-byte Folded Spill292; CHECK-NEXT:    str z16, [sp, #9, mul vl] // 16-byte Folded Spill293; CHECK-NEXT:    str z15, [sp, #10, mul vl] // 16-byte Folded Spill294; CHECK-NEXT:    str z14, [sp, #11, mul vl] // 16-byte Folded Spill295; CHECK-NEXT:    str z13, [sp, #12, mul vl] // 16-byte Folded Spill296; CHECK-NEXT:    str z12, [sp, #13, mul vl] // 16-byte Folded Spill297; CHECK-NEXT:    str z11, [sp, #14, mul vl] // 16-byte Folded Spill298; CHECK-NEXT:    str z10, [sp, #15, mul vl] // 16-byte Folded Spill299; CHECK-NEXT:    str z9, [sp, #16, mul vl] // 16-byte Folded Spill300; CHECK-NEXT:    str z8, [sp, #17, mul vl] // 16-byte Folded Spill301; CHECK-NEXT:    addvl sp, sp, #-1302; CHECK-NEXT:    str p0, [sp, #7, mul vl] // 2-byte Spill303; CHECK-NEXT:    mrs x19, SVCR304; CHECK-NEXT:    tbz w19, #0, .LBB6_2305; CHECK-NEXT:  // %bb.1:306; CHECK-NEXT:    smstop sm307; CHECK-NEXT:  .LBB6_2:308; CHECK-NEXT:    rdvl x8, #1309; CHECK-NEXT:    addsvl x8, x8, #-1310; CHECK-NEXT:    cbz x8, .LBB6_4311; CHECK-NEXT:  // %bb.3:312; CHECK-NEXT:    brk #0x1313; CHECK-NEXT:  .LBB6_4:314; CHECK-NEXT:    ldr p0, [sp, #7, mul vl] // 2-byte Reload315; CHECK-NEXT:    bl normal_callee_predicate_vec_arg316; CHECK-NEXT:    str p0, [sp, #6, mul vl] // 2-byte Spill317; CHECK-NEXT:    tbz w19, #0, .LBB6_6318; CHECK-NEXT:  // %bb.5:319; CHECK-NEXT:    smstart sm320; CHECK-NEXT:  .LBB6_6:321; CHECK-NEXT:    ldr p0, [sp, #7, mul vl] // 2-byte Reload322; CHECK-NEXT:    ldr p1, [sp, #6, mul vl] // 2-byte Reload323; CHECK-NEXT:    and p0.b, p1/z, p1.b, p0.b324; CHECK-NEXT:    addvl sp, sp, #1325; CHECK-NEXT:    ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload326; CHECK-NEXT:    ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload327; CHECK-NEXT:    ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload328; CHECK-NEXT:    ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload329; CHECK-NEXT:    ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload330; CHECK-NEXT:    ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload331; CHECK-NEXT:    ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload332; CHECK-NEXT:    ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload333; CHECK-NEXT:    ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload334; CHECK-NEXT:    ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload335; CHECK-NEXT:    ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload336; CHECK-NEXT:    ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload337; CHECK-NEXT:    ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload338; CHECK-NEXT:    ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload339; CHECK-NEXT:    ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload340; CHECK-NEXT:    ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload341; CHECK-NEXT:    ldr p15, [sp, #4, mul vl] // 2-byte Reload342; CHECK-NEXT:    ldr p14, [sp, #5, mul vl] // 2-byte Reload343; CHECK-NEXT:    ldr p13, [sp, #6, mul vl] // 2-byte Reload344; CHECK-NEXT:    ldr p12, [sp, #7, mul vl] // 2-byte Reload345; CHECK-NEXT:    ldr p11, [sp, #8, mul vl] // 2-byte Reload346; CHECK-NEXT:    ldr p10, [sp, #9, mul vl] // 2-byte Reload347; CHECK-NEXT:    ldr p9, [sp, #10, mul vl] // 2-byte Reload348; CHECK-NEXT:    ldr p8, [sp, #11, mul vl] // 2-byte Reload349; CHECK-NEXT:    ldr p7, [sp, #12, mul vl] // 2-byte Reload350; CHECK-NEXT:    ldr p6, [sp, #13, mul vl] // 2-byte Reload351; CHECK-NEXT:    ldr p5, [sp, #14, mul vl] // 2-byte Reload352; CHECK-NEXT:    ldr p4, [sp, #15, mul vl] // 2-byte Reload353; CHECK-NEXT:    addvl sp, sp, #18354; CHECK-NEXT:    ldp x30, x19, [sp, #16] // 16-byte Folded Reload355; CHECK-NEXT:    ldr x29, [sp], #32 // 8-byte Folded Reload356; CHECK-NEXT:    ret357  %res = call <vscale x 2 x i1> @normal_callee_predicate_vec_arg(<vscale x 2 x i1> %arg)358  %and = and <vscale x 2 x i1> %res, %arg359  ret <vscale x 2 x i1> %and360}361 362declare <vscale x 2 x i1> @normal_callee_predicate_vec_arg(<vscale x 2 x i1>)363 364define i32 @conditional_smstart_unreachable_block() "aarch64_pstate_sm_compatible" nounwind {365; CHECK-LABEL: conditional_smstart_unreachable_block:366; CHECK:       // %bb.0:367; CHECK-NEXT:    stp d15, d14, [sp, #-80]! // 16-byte Folded Spill368; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill369; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill370; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill371; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill372; CHECK-NEXT:    mrs x19, SVCR373; CHECK-NEXT:    tbnz w19, #0, .LBB7_2374; CHECK-NEXT:  // %bb.1:375; CHECK-NEXT:    smstart sm376; CHECK-NEXT:  .LBB7_2:377; CHECK-NEXT:    bl streaming_callee378  call void @streaming_callee()379  unreachable380}381 382define void @conditional_smstart_no_successor_block(i1 %p) "aarch64_pstate_sm_compatible" nounwind {383; CHECK-LABEL: conditional_smstart_no_successor_block:384; CHECK:       // %bb.0:385; CHECK-NEXT:    stp d15, d14, [sp, #-80]! // 16-byte Folded Spill386; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill387; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill388; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill389; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill390; CHECK-NEXT:    mrs x19, SVCR391; CHECK-NEXT:    tbz w0, #0, .LBB8_5392; CHECK-NEXT:  // %bb.1: // %if.then393; CHECK-NEXT:    tbnz w19, #0, .LBB8_3394; CHECK-NEXT:  // %bb.2: // %if.then395; CHECK-NEXT:    smstart sm396; CHECK-NEXT:  .LBB8_3: // %if.then397; CHECK-NEXT:    bl streaming_callee398; CHECK-NEXT:    tbnz w19, #0, .LBB8_5399; CHECK-NEXT:  // %bb.4: // %if.then400; CHECK-NEXT:    smstop sm401; CHECK-NEXT:  .LBB8_5: // %exit402; CHECK-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload403; CHECK-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload404; CHECK-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload405; CHECK-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload406; CHECK-NEXT:    ldp d15, d14, [sp], #80 // 16-byte Folded Reload407; CHECK-NEXT:    ret408  br i1 %p, label %if.then, label %exit409 410if.then:411  call void @streaming_callee()412  br label %exit413 414exit:415  ret void416}417 418define void @disable_tailcallopt() "aarch64_pstate_sm_compatible" nounwind {419; CHECK-LABEL: disable_tailcallopt:420; CHECK:       // %bb.0:421; CHECK-NEXT:    stp d15, d14, [sp, #-80]! // 16-byte Folded Spill422; CHECK-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill423; CHECK-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill424; CHECK-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill425; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill426; CHECK-NEXT:    mrs x19, SVCR427; CHECK-NEXT:    tbz w19, #0, .LBB9_2428; CHECK-NEXT:  // %bb.1:429; CHECK-NEXT:    smstop sm430; CHECK-NEXT:  .LBB9_2:431; CHECK-NEXT:    bl normal_callee432; CHECK-NEXT:    tbz w19, #0, .LBB9_4433; CHECK-NEXT:  // %bb.3:434; CHECK-NEXT:    smstart sm435; CHECK-NEXT:  .LBB9_4:436; CHECK-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload437; CHECK-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload438; CHECK-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload439; CHECK-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload440; CHECK-NEXT:    ldp d15, d14, [sp], #80 // 16-byte Folded Reload441; CHECK-NEXT:    ret442 443  tail call void @normal_callee();444  ret void;445}446 447define 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) "aarch64_pstate_sm_compatible" {448; CHECK-LABEL: call_to_non_streaming_pass_args:449; CHECK:       // %bb.0: // %entry450; CHECK-NEXT:    sub sp, sp, #128451; CHECK-NEXT:    .cfi_def_cfa_offset 128452; CHECK-NEXT:    cntd x9453; CHECK-NEXT:    stp d15, d14, [sp, #32] // 16-byte Folded Spill454; CHECK-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill455; CHECK-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill456; CHECK-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill457; CHECK-NEXT:    stp x29, x30, [sp, #96] // 16-byte Folded Spill458; CHECK-NEXT:    stp x9, x19, [sp, #112] // 16-byte Folded Spill459; CHECK-NEXT:    .cfi_offset w19, -8460; CHECK-NEXT:    .cfi_offset vg, -16461; CHECK-NEXT:    .cfi_offset w30, -24462; CHECK-NEXT:    .cfi_offset w29, -32463; CHECK-NEXT:    .cfi_offset b8, -40464; CHECK-NEXT:    .cfi_offset b9, -48465; CHECK-NEXT:    .cfi_offset b10, -56466; CHECK-NEXT:    .cfi_offset b11, -64467; CHECK-NEXT:    .cfi_offset b12, -72468; CHECK-NEXT:    .cfi_offset b13, -80469; CHECK-NEXT:    .cfi_offset b14, -88470; CHECK-NEXT:    .cfi_offset b15, -96471; CHECK-NEXT:    stp d2, d3, [sp, #16] // 16-byte Folded Spill472; CHECK-NEXT:    stp s0, s1, [sp, #8] // 8-byte Folded Spill473; CHECK-NEXT:    mrs x19, SVCR474; CHECK-NEXT:    tbz w19, #0, .LBB10_2475; CHECK-NEXT:  // %bb.1: // %entry476; CHECK-NEXT:    smstop sm477; CHECK-NEXT:  .LBB10_2: // %entry478; CHECK-NEXT:    ldp s0, s1, [sp, #8] // 8-byte Folded Reload479; CHECK-NEXT:    ldp d2, d3, [sp, #16] // 16-byte Folded Reload480; CHECK-NEXT:    bl bar481; CHECK-NEXT:    tbz w19, #0, .LBB10_4482; CHECK-NEXT:  // %bb.3: // %entry483; CHECK-NEXT:    smstart sm484; CHECK-NEXT:  .LBB10_4: // %entry485; CHECK-NEXT:    ldp x29, x30, [sp, #96] // 16-byte Folded Reload486; CHECK-NEXT:    ldr x19, [sp, #120] // 8-byte Reload487; CHECK-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload488; CHECK-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload489; CHECK-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload490; CHECK-NEXT:    ldp d15, d14, [sp, #32] // 16-byte Folded Reload491; CHECK-NEXT:    add sp, sp, #128492; CHECK-NEXT:    .cfi_def_cfa_offset 0493; CHECK-NEXT:    .cfi_restore w19494; CHECK-NEXT:    .cfi_restore vg495; CHECK-NEXT:    .cfi_restore w30496; CHECK-NEXT:    .cfi_restore w29497; CHECK-NEXT:    .cfi_restore b8498; CHECK-NEXT:    .cfi_restore b9499; CHECK-NEXT:    .cfi_restore b10500; CHECK-NEXT:    .cfi_restore b11501; CHECK-NEXT:    .cfi_restore b12502; CHECK-NEXT:    .cfi_restore b13503; CHECK-NEXT:    .cfi_restore b14504; CHECK-NEXT:    .cfi_restore b15505; CHECK-NEXT:    ret506entry:507  call void @bar(ptr noundef nonnull %ptr, i64 %long1, i64 %long2, i32 %int1, i32 %int2, float %float1, float %float2, double %double1, double %double2)508  ret void509}510 511declare void @bar(ptr noundef, i64 noundef, i64 noundef, i32 noundef, i32 noundef, float noundef, float noundef, double noundef, double noundef)512