brintos

brintos / llvm-project-archived public Read only

0
0
Text · 34.8 KiB · 240b204 Raw
932 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 -mattr=+sme < %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -aarch64-new-sme-abi < %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-NEWLOWERING4 5declare void @private_za_call()6declare void @shared_za_call() "aarch64_inout_za"7 8define void @private_za_loop(i32 %n) "aarch64_inout_za" nounwind {9; CHECK-LABEL: private_za_loop:10; CHECK:       // %bb.0: // %entry11; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill12; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill13; CHECK-NEXT:    mov x29, sp14; CHECK-NEXT:    sub sp, sp, #1615; CHECK-NEXT:    rdsvl x8, #116; CHECK-NEXT:    mov x9, sp17; CHECK-NEXT:    msub x9, x8, x8, x918; CHECK-NEXT:    mov sp, x919; CHECK-NEXT:    cmp w0, #120; CHECK-NEXT:    stp x9, x8, [x29, #-16]21; CHECK-NEXT:    b.lt .LBB0_522; CHECK-NEXT:  // %bb.1: // %loop.preheader23; CHECK-NEXT:    mov w19, w024; CHECK-NEXT:    sub x20, x29, #1625; CHECK-NEXT:    b .LBB0_326; CHECK-NEXT:  .LBB0_2: // %loop27; CHECK-NEXT:    // in Loop: Header=BB0_3 Depth=128; CHECK-NEXT:    subs w19, w19, #129; CHECK-NEXT:    msr TPIDR2_EL0, xzr30; CHECK-NEXT:    b.eq .LBB0_531; CHECK-NEXT:  .LBB0_3: // %loop32; CHECK-NEXT:    // =>This Inner Loop Header: Depth=133; CHECK-NEXT:    msr TPIDR2_EL0, x2034; CHECK-NEXT:    bl private_za_call35; CHECK-NEXT:    smstart za36; CHECK-NEXT:    mrs x8, TPIDR2_EL037; CHECK-NEXT:    sub x0, x29, #1638; CHECK-NEXT:    cbnz x8, .LBB0_239; CHECK-NEXT:  // %bb.4: // %loop40; CHECK-NEXT:    // in Loop: Header=BB0_3 Depth=141; CHECK-NEXT:    bl __arm_tpidr2_restore42; CHECK-NEXT:    b .LBB0_243; CHECK-NEXT:  .LBB0_5: // %exit44; CHECK-NEXT:    mov sp, x2945; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload46; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload47; CHECK-NEXT:    ret48;49; CHECK-NEWLOWERING-LABEL: private_za_loop:50; CHECK-NEWLOWERING:       // %bb.0: // %entry51; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill52; CHECK-NEWLOWERING-NEXT:    str x19, [sp, #16] // 8-byte Spill53; CHECK-NEWLOWERING-NEXT:    mov x29, sp54; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #1655; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #156; CHECK-NEWLOWERING-NEXT:    mov x9, sp57; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x958; CHECK-NEWLOWERING-NEXT:    mov sp, x959; CHECK-NEWLOWERING-NEXT:    sub x10, x29, #1660; CHECK-NEWLOWERING-NEXT:    cmp w0, #161; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]62; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x1063; CHECK-NEWLOWERING-NEXT:    b.lt .LBB0_364; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %loop.preheader65; CHECK-NEWLOWERING-NEXT:    mov w19, w066; CHECK-NEWLOWERING-NEXT:  .LBB0_2: // %loop67; CHECK-NEWLOWERING-NEXT:    // =>This Inner Loop Header: Depth=168; CHECK-NEWLOWERING-NEXT:    bl private_za_call69; CHECK-NEWLOWERING-NEXT:    subs w19, w19, #170; CHECK-NEWLOWERING-NEXT:    b.ne .LBB0_271; CHECK-NEWLOWERING-NEXT:  .LBB0_3: // %exit72; CHECK-NEWLOWERING-NEXT:    smstart za73; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL074; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #1675; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB0_576; CHECK-NEWLOWERING-NEXT:  // %bb.4: // %exit77; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore78; CHECK-NEWLOWERING-NEXT:  .LBB0_5: // %exit79; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr80; CHECK-NEWLOWERING-NEXT:    mov sp, x2981; CHECK-NEWLOWERING-NEXT:    ldr x19, [sp, #16] // 8-byte Reload82; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload83; CHECK-NEWLOWERING-NEXT:    ret84entry:85  %cmpgt = icmp sgt i32 %n, 086  br i1 %cmpgt, label %loop, label %exit87 88loop:89  %iv = phi i32 [ %next_iv, %loop ], [ 0, %entry ]90  tail call void @private_za_call()91  %next_iv = add nuw nsw i32 %iv, 192  %cmpeq = icmp eq i32 %next_iv, %n93  br i1 %cmpeq, label %exit, label %loop94 95exit:96  ret void97}98 99; FIXME: In the new lowering we could weight edges to avoid doing the lazy save in the loop.100define void @private_za_loop_active_entry_and_exit(i32 %n) "aarch64_inout_za" nounwind {101; CHECK-LABEL: private_za_loop_active_entry_and_exit:102; CHECK:       // %bb.0: // %entry103; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill104; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill105; CHECK-NEXT:    mov x29, sp106; CHECK-NEXT:    sub sp, sp, #16107; CHECK-NEXT:    rdsvl x8, #1108; CHECK-NEXT:    mov x9, sp109; CHECK-NEXT:    mov w19, w0110; CHECK-NEXT:    msub x9, x8, x8, x9111; CHECK-NEXT:    mov sp, x9112; CHECK-NEXT:    stp x9, x8, [x29, #-16]113; CHECK-NEXT:    bl shared_za_call114; CHECK-NEXT:    cmp w19, #1115; CHECK-NEXT:    b.lt .LBB1_5116; CHECK-NEXT:  // %bb.1: // %loop.preheader117; CHECK-NEXT:    sub x20, x29, #16118; CHECK-NEXT:    b .LBB1_3119; CHECK-NEXT:  .LBB1_2: // %loop120; CHECK-NEXT:    // in Loop: Header=BB1_3 Depth=1121; CHECK-NEXT:    subs w19, w19, #1122; CHECK-NEXT:    msr TPIDR2_EL0, xzr123; CHECK-NEXT:    b.eq .LBB1_5124; CHECK-NEXT:  .LBB1_3: // %loop125; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1126; CHECK-NEXT:    msr TPIDR2_EL0, x20127; CHECK-NEXT:    bl private_za_call128; CHECK-NEXT:    smstart za129; CHECK-NEXT:    mrs x8, TPIDR2_EL0130; CHECK-NEXT:    sub x0, x29, #16131; CHECK-NEXT:    cbnz x8, .LBB1_2132; CHECK-NEXT:  // %bb.4: // %loop133; CHECK-NEXT:    // in Loop: Header=BB1_3 Depth=1134; CHECK-NEXT:    bl __arm_tpidr2_restore135; CHECK-NEXT:    b .LBB1_2136; CHECK-NEXT:  .LBB1_5: // %exit137; CHECK-NEXT:    mov sp, x29138; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload139; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload140; CHECK-NEXT:    b shared_za_call141;142; CHECK-NEWLOWERING-LABEL: private_za_loop_active_entry_and_exit:143; CHECK-NEWLOWERING:       // %bb.0: // %entry144; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill145; CHECK-NEWLOWERING-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill146; CHECK-NEWLOWERING-NEXT:    mov x29, sp147; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16148; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1149; CHECK-NEWLOWERING-NEXT:    mov x9, sp150; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9151; CHECK-NEWLOWERING-NEXT:    mov sp, x9152; CHECK-NEWLOWERING-NEXT:    mov w19, w0153; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]154; CHECK-NEWLOWERING-NEXT:    bl shared_za_call155; CHECK-NEWLOWERING-NEXT:    cmp w19, #1156; CHECK-NEWLOWERING-NEXT:    b.lt .LBB1_5157; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %loop.preheader158; CHECK-NEWLOWERING-NEXT:    sub x20, x29, #16159; CHECK-NEWLOWERING-NEXT:    b .LBB1_3160; CHECK-NEWLOWERING-NEXT:  .LBB1_2: // %loop161; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB1_3 Depth=1162; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr163; CHECK-NEWLOWERING-NEXT:    cbz w19, .LBB1_5164; CHECK-NEWLOWERING-NEXT:  .LBB1_3: // %loop165; CHECK-NEWLOWERING-NEXT:    // =>This Inner Loop Header: Depth=1166; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x20167; CHECK-NEWLOWERING-NEXT:    bl private_za_call168; CHECK-NEWLOWERING-NEXT:    sub w19, w19, #1169; CHECK-NEWLOWERING-NEXT:    smstart za170; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0171; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16172; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB1_2173; CHECK-NEWLOWERING-NEXT:  // %bb.4: // %loop174; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB1_3 Depth=1175; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore176; CHECK-NEWLOWERING-NEXT:    b .LBB1_2177; CHECK-NEWLOWERING-NEXT:  .LBB1_5: // %exit178; CHECK-NEWLOWERING-NEXT:    mov sp, x29179; CHECK-NEWLOWERING-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload180; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload181; CHECK-NEWLOWERING-NEXT:    b shared_za_call182entry:183  %cmpgt = icmp sgt i32 %n, 0184  tail call void @shared_za_call()185  br i1 %cmpgt, label %loop, label %exit186 187loop:188  %iv = phi i32 [ %next_iv, %loop ], [ 0, %entry ]189  tail call void @private_za_call()190  %next_iv = add nuw nsw i32 %iv, 1191  %cmpeq = icmp eq i32 %next_iv, %n192  br i1 %cmpeq, label %exit, label %loop193 194exit:195  tail call void @shared_za_call()196  ret void197}198 199define void @shared_za_loop(i32 %n) "aarch64_inout_za" nounwind {200; CHECK-COMMON-LABEL: shared_za_loop:201; CHECK-COMMON:       // %bb.0: // %entry202; CHECK-COMMON-NEXT:    cmp w0, #1203; CHECK-COMMON-NEXT:    b.lt .LBB2_4204; CHECK-COMMON-NEXT:  // %bb.1: // %loop.preheader205; CHECK-COMMON-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill206; CHECK-COMMON-NEXT:    mov w19, w0207; CHECK-COMMON-NEXT:  .LBB2_2: // %loop208; CHECK-COMMON-NEXT:    // =>This Inner Loop Header: Depth=1209; CHECK-COMMON-NEXT:    bl shared_za_call210; CHECK-COMMON-NEXT:    subs w19, w19, #1211; CHECK-COMMON-NEXT:    b.ne .LBB2_2212; CHECK-COMMON-NEXT:  // %bb.3:213; CHECK-COMMON-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload214; CHECK-COMMON-NEXT:  .LBB2_4: // %exit215; CHECK-COMMON-NEXT:    ret216entry:217  %cmpgt = icmp sgt i32 %n, 0218  br i1 %cmpgt, label %loop, label %exit219 220loop:221  %iv = phi i32 [ %next_iv, %loop ], [ 0, %entry ]222  tail call void @shared_za_call()223  %next_iv = add nuw nsw i32 %iv, 1224  %cmpeq = icmp eq i32 %next_iv, %n225  br i1 %cmpeq, label %exit, label %loop226 227exit:228  ret void229}230 231define void @cond_private_za_call(i1 %cond) "aarch64_inout_za" nounwind {232; CHECK-COMMON-LABEL: cond_private_za_call:233; CHECK-COMMON:       // %bb.0:234; CHECK-COMMON-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill235; CHECK-COMMON-NEXT:    mov x29, sp236; CHECK-COMMON-NEXT:    sub sp, sp, #16237; CHECK-COMMON-NEXT:    rdsvl x8, #1238; CHECK-COMMON-NEXT:    mov x9, sp239; CHECK-COMMON-NEXT:    msub x9, x8, x8, x9240; CHECK-COMMON-NEXT:    mov sp, x9241; CHECK-COMMON-NEXT:    stp x9, x8, [x29, #-16]242; CHECK-COMMON-NEXT:    tbz w0, #0, .LBB3_4243; CHECK-COMMON-NEXT:  // %bb.1: // %private_za_call244; CHECK-COMMON-NEXT:    sub x8, x29, #16245; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, x8246; CHECK-COMMON-NEXT:    bl private_za_call247; CHECK-COMMON-NEXT:    smstart za248; CHECK-COMMON-NEXT:    mrs x8, TPIDR2_EL0249; CHECK-COMMON-NEXT:    sub x0, x29, #16250; CHECK-COMMON-NEXT:    cbnz x8, .LBB3_3251; CHECK-COMMON-NEXT:  // %bb.2: // %private_za_call252; CHECK-COMMON-NEXT:    bl __arm_tpidr2_restore253; CHECK-COMMON-NEXT:  .LBB3_3: // %private_za_call254; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, xzr255; CHECK-COMMON-NEXT:  .LBB3_4: // %exit256; CHECK-COMMON-NEXT:    mov sp, x29257; CHECK-COMMON-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload258; CHECK-COMMON-NEXT:    b shared_za_call259  br i1 %cond, label %private_za_call, label %exit260 261private_za_call:262  tail call void @private_za_call()263  br label %exit264 265exit:266  tail call void @shared_za_call()267  ret void268}269 270define void @mixed_shared_private_za_loop(ptr %cond) "aarch64_inout_za" nounwind {271; CHECK-LABEL: mixed_shared_private_za_loop:272; CHECK:       // %bb.0:273; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill274; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill275; CHECK-NEXT:    mov x29, sp276; CHECK-NEXT:    sub sp, sp, #16277; CHECK-NEXT:    rdsvl x8, #1278; CHECK-NEXT:    mov x9, sp279; CHECK-NEXT:    mov x19, x0280; CHECK-NEXT:    msub x9, x8, x8, x9281; CHECK-NEXT:    mov sp, x9282; CHECK-NEXT:    sub x20, x29, #16283; CHECK-NEXT:    stp x9, x8, [x29, #-16]284; CHECK-NEXT:    b .LBB4_2285; CHECK-NEXT:  .LBB4_1: // %loop286; CHECK-NEXT:    // in Loop: Header=BB4_2 Depth=1287; CHECK-NEXT:    msr TPIDR2_EL0, xzr288; CHECK-NEXT:    ldrb w8, [x19]289; CHECK-NEXT:    tbz w8, #0, .LBB4_4290; CHECK-NEXT:  .LBB4_2: // %loop291; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1292; CHECK-NEXT:    bl shared_za_call293; CHECK-NEXT:    msr TPIDR2_EL0, x20294; CHECK-NEXT:    bl private_za_call295; CHECK-NEXT:    smstart za296; CHECK-NEXT:    mrs x8, TPIDR2_EL0297; CHECK-NEXT:    sub x0, x29, #16298; CHECK-NEXT:    cbnz x8, .LBB4_1299; CHECK-NEXT:  // %bb.3: // %loop300; CHECK-NEXT:    // in Loop: Header=BB4_2 Depth=1301; CHECK-NEXT:    bl __arm_tpidr2_restore302; CHECK-NEXT:    b .LBB4_1303; CHECK-NEXT:  .LBB4_4: // %exit304; CHECK-NEXT:    bl shared_za_call305; CHECK-NEXT:    mov sp, x29306; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload307; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload308; CHECK-NEXT:    ret309;310; CHECK-NEWLOWERING-LABEL: mixed_shared_private_za_loop:311; CHECK-NEWLOWERING:       // %bb.0:312; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill313; CHECK-NEWLOWERING-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill314; CHECK-NEWLOWERING-NEXT:    mov x29, sp315; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16316; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1317; CHECK-NEWLOWERING-NEXT:    mov x9, sp318; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9319; CHECK-NEWLOWERING-NEXT:    mov sp, x9320; CHECK-NEWLOWERING-NEXT:    mov x19, x0321; CHECK-NEWLOWERING-NEXT:    sub x20, x29, #16322; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]323; CHECK-NEWLOWERING-NEXT:    b .LBB4_2324; CHECK-NEWLOWERING-NEXT:  .LBB4_1: // %loop325; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB4_2 Depth=1326; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr327; CHECK-NEWLOWERING-NEXT:    tbz w8, #0, .LBB4_4328; CHECK-NEWLOWERING-NEXT:  .LBB4_2: // %loop329; CHECK-NEWLOWERING-NEXT:    // =>This Inner Loop Header: Depth=1330; CHECK-NEWLOWERING-NEXT:    bl shared_za_call331; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x20332; CHECK-NEWLOWERING-NEXT:    bl private_za_call333; CHECK-NEWLOWERING-NEXT:    ldrb w8, [x19]334; CHECK-NEWLOWERING-NEXT:    smstart za335; CHECK-NEWLOWERING-NEXT:    mrs x9, TPIDR2_EL0336; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16337; CHECK-NEWLOWERING-NEXT:    cbnz x9, .LBB4_1338; CHECK-NEWLOWERING-NEXT:  // %bb.3: // %loop339; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB4_2 Depth=1340; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore341; CHECK-NEWLOWERING-NEXT:    b .LBB4_1342; CHECK-NEWLOWERING-NEXT:  .LBB4_4: // %exit343; CHECK-NEWLOWERING-NEXT:    bl shared_za_call344; CHECK-NEWLOWERING-NEXT:    mov sp, x29345; CHECK-NEWLOWERING-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload346; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload347; CHECK-NEWLOWERING-NEXT:    ret348  br label %loop349 350loop:351  call void @shared_za_call()352  call void @private_za_call()353  br label %latch354 355latch:356  %bool = load volatile i8, ptr %cond, align 1357  %trunc = trunc i8 %bool to i1358  br i1 %trunc, label %loop, label %exit359 360exit:361  call void @shared_za_call()362  ret void363}364 365 366define void @cond_clobber_followed_by_clobber(i1 %cond) "aarch64_inout_za" nounwind {367; CHECK-LABEL: cond_clobber_followed_by_clobber:368; CHECK:       // %bb.0:369; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill370; CHECK-NEXT:    str x19, [sp, #16] // 8-byte Spill371; CHECK-NEXT:    mov x29, sp372; CHECK-NEXT:    sub sp, sp, #16373; CHECK-NEXT:    rdsvl x8, #1374; CHECK-NEXT:    mov x9, sp375; CHECK-NEXT:    mov w19, w0376; CHECK-NEXT:    msub x9, x8, x8, x9377; CHECK-NEXT:    mov sp, x9378; CHECK-NEXT:    stp x9, x8, [x29, #-16]379; CHECK-NEXT:    bl shared_za_call380; CHECK-NEXT:    tbz w19, #0, .LBB5_4381; CHECK-NEXT:  // %bb.1: // %cond_clobber382; CHECK-NEXT:    sub x8, x29, #16383; CHECK-NEXT:    msr TPIDR2_EL0, x8384; CHECK-NEXT:    bl private_za_call385; CHECK-NEXT:    smstart za386; CHECK-NEXT:    mrs x8, TPIDR2_EL0387; CHECK-NEXT:    sub x0, x29, #16388; CHECK-NEXT:    cbnz x8, .LBB5_3389; CHECK-NEXT:  // %bb.2: // %cond_clobber390; CHECK-NEXT:    bl __arm_tpidr2_restore391; CHECK-NEXT:  .LBB5_3: // %cond_clobber392; CHECK-NEXT:    msr TPIDR2_EL0, xzr393; CHECK-NEXT:  .LBB5_4: // %exit394; CHECK-NEXT:    sub x8, x29, #16395; CHECK-NEXT:    msr TPIDR2_EL0, x8396; CHECK-NEXT:    bl private_za_call397; CHECK-NEXT:    smstart za398; CHECK-NEXT:    mrs x8, TPIDR2_EL0399; CHECK-NEXT:    sub x0, x29, #16400; CHECK-NEXT:    cbnz x8, .LBB5_6401; CHECK-NEXT:  // %bb.5: // %exit402; CHECK-NEXT:    bl __arm_tpidr2_restore403; CHECK-NEXT:  .LBB5_6: // %exit404; CHECK-NEXT:    msr TPIDR2_EL0, xzr405; CHECK-NEXT:    mov sp, x29406; CHECK-NEXT:    ldr x19, [sp, #16] // 8-byte Reload407; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload408; CHECK-NEXT:    b shared_za_call409;410; CHECK-NEWLOWERING-LABEL: cond_clobber_followed_by_clobber:411; CHECK-NEWLOWERING:       // %bb.0:412; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill413; CHECK-NEWLOWERING-NEXT:    str x19, [sp, #16] // 8-byte Spill414; CHECK-NEWLOWERING-NEXT:    mov x29, sp415; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16416; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1417; CHECK-NEWLOWERING-NEXT:    mov x9, sp418; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9419; CHECK-NEWLOWERING-NEXT:    mov sp, x9420; CHECK-NEWLOWERING-NEXT:    mov w19, w0421; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]422; CHECK-NEWLOWERING-NEXT:    bl shared_za_call423; CHECK-NEWLOWERING-NEXT:    sub x8, x29, #16424; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x8425; CHECK-NEWLOWERING-NEXT:    tbz w19, #0, .LBB5_2426; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %cond_clobber427; CHECK-NEWLOWERING-NEXT:    bl private_za_call428; CHECK-NEWLOWERING-NEXT:  .LBB5_2: // %exit429; CHECK-NEWLOWERING-NEXT:    bl private_za_call430; CHECK-NEWLOWERING-NEXT:    smstart za431; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0432; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16433; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB5_4434; CHECK-NEWLOWERING-NEXT:  // %bb.3: // %exit435; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore436; CHECK-NEWLOWERING-NEXT:  .LBB5_4: // %exit437; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr438; CHECK-NEWLOWERING-NEXT:    mov sp, x29439; CHECK-NEWLOWERING-NEXT:    ldr x19, [sp, #16] // 8-byte Reload440; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload441; CHECK-NEWLOWERING-NEXT:    b shared_za_call442  tail call void @shared_za_call()443  br i1 %cond, label %cond_clobber, label %exit444 445cond_clobber:446  tail call void @private_za_call()447  br label %exit448 449exit:450  tail call void @private_za_call()451  tail call void @shared_za_call()452  ret void453}454 455define void @conditionally_use_za(i1 %cond) "aarch64_inout_za" nounwind {456; CHECK-COMMON-LABEL: conditionally_use_za:457; CHECK-COMMON:       // %bb.0:458; CHECK-COMMON-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill459; CHECK-COMMON-NEXT:    mov x29, sp460; CHECK-COMMON-NEXT:    sub sp, sp, #16461; CHECK-COMMON-NEXT:    rdsvl x8, #1462; CHECK-COMMON-NEXT:    mov x9, sp463; CHECK-COMMON-NEXT:    msub x9, x8, x8, x9464; CHECK-COMMON-NEXT:    mov sp, x9465; CHECK-COMMON-NEXT:    stp x9, x8, [x29, #-16]466; CHECK-COMMON-NEXT:    tbz w0, #0, .LBB6_4467; CHECK-COMMON-NEXT:  // %bb.1: // %use_za468; CHECK-COMMON-NEXT:    bl shared_za_call469; CHECK-COMMON-NEXT:    sub x8, x29, #16470; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, x8471; CHECK-COMMON-NEXT:    bl private_za_call472; CHECK-COMMON-NEXT:    smstart za473; CHECK-COMMON-NEXT:    mrs x8, TPIDR2_EL0474; CHECK-COMMON-NEXT:    sub x0, x29, #16475; CHECK-COMMON-NEXT:    cbnz x8, .LBB6_3476; CHECK-COMMON-NEXT:  // %bb.2: // %use_za477; CHECK-COMMON-NEXT:    bl __arm_tpidr2_restore478; CHECK-COMMON-NEXT:  .LBB6_3: // %use_za479; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, xzr480; CHECK-COMMON-NEXT:  .LBB6_4: // %exit481; CHECK-COMMON-NEXT:    mov sp, x29482; CHECK-COMMON-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload483; CHECK-COMMON-NEXT:    ret484  br i1 %cond, label %use_za, label %exit485 486use_za:487  tail call void @shared_za_call()488  tail call void @private_za_call()489  br label %exit490 491exit:492  ret void493}494 495 496define void @diamond_mixed_za_merge_shared(i1 %cond) "aarch64_inout_za" nounwind {497; CHECK-COMMON-LABEL: diamond_mixed_za_merge_shared:498; CHECK-COMMON:       // %bb.0: // %entry499; CHECK-COMMON-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill500; CHECK-COMMON-NEXT:    mov x29, sp501; CHECK-COMMON-NEXT:    sub sp, sp, #16502; CHECK-COMMON-NEXT:    rdsvl x8, #1503; CHECK-COMMON-NEXT:    mov x9, sp504; CHECK-COMMON-NEXT:    msub x9, x8, x8, x9505; CHECK-COMMON-NEXT:    mov sp, x9506; CHECK-COMMON-NEXT:    stp x9, x8, [x29, #-16]507; CHECK-COMMON-NEXT:    tbz w0, #0, .LBB7_2508; CHECK-COMMON-NEXT:  // %bb.1: // %then509; CHECK-COMMON-NEXT:    bl shared_za_call510; CHECK-COMMON-NEXT:    b .LBB7_5511; CHECK-COMMON-NEXT:  .LBB7_2: // %else512; CHECK-COMMON-NEXT:    sub x8, x29, #16513; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, x8514; CHECK-COMMON-NEXT:    bl private_za_call515; CHECK-COMMON-NEXT:    smstart za516; CHECK-COMMON-NEXT:    mrs x8, TPIDR2_EL0517; CHECK-COMMON-NEXT:    sub x0, x29, #16518; CHECK-COMMON-NEXT:    cbnz x8, .LBB7_4519; CHECK-COMMON-NEXT:  // %bb.3: // %else520; CHECK-COMMON-NEXT:    bl __arm_tpidr2_restore521; CHECK-COMMON-NEXT:  .LBB7_4: // %else522; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, xzr523; CHECK-COMMON-NEXT:  .LBB7_5: // %merge_shared524; CHECK-COMMON-NEXT:    bl shared_za_call525; CHECK-COMMON-NEXT:    mov sp, x29526; CHECK-COMMON-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload527; CHECK-COMMON-NEXT:    ret528entry:529  br i1 %cond, label %then, label %else530 531then:532  call void @shared_za_call()533  br label %merge_shared534 535else:536  call void @private_za_call()537  br label %merge_shared538 539merge_shared:540  call void @shared_za_call()541  ret void542}543 544 545define void @diamond_mixed_za_merge_private(i1 %cond) "aarch64_inout_za" nounwind {546; CHECK-LABEL: diamond_mixed_za_merge_private:547; CHECK:       // %bb.0: // %entry548; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill549; CHECK-NEXT:    mov x29, sp550; CHECK-NEXT:    sub sp, sp, #16551; CHECK-NEXT:    rdsvl x8, #1552; CHECK-NEXT:    mov x9, sp553; CHECK-NEXT:    msub x9, x8, x8, x9554; CHECK-NEXT:    mov sp, x9555; CHECK-NEXT:    stp x9, x8, [x29, #-16]556; CHECK-NEXT:    tbz w0, #0, .LBB8_2557; CHECK-NEXT:  // %bb.1: // %then558; CHECK-NEXT:    bl shared_za_call559; CHECK-NEXT:    b .LBB8_5560; CHECK-NEXT:  .LBB8_2: // %else561; CHECK-NEXT:    sub x8, x29, #16562; CHECK-NEXT:    msr TPIDR2_EL0, x8563; CHECK-NEXT:    bl private_za_call564; CHECK-NEXT:    smstart za565; CHECK-NEXT:    mrs x8, TPIDR2_EL0566; CHECK-NEXT:    sub x0, x29, #16567; CHECK-NEXT:    cbnz x8, .LBB8_4568; CHECK-NEXT:  // %bb.3: // %else569; CHECK-NEXT:    bl __arm_tpidr2_restore570; CHECK-NEXT:  .LBB8_4: // %else571; CHECK-NEXT:    msr TPIDR2_EL0, xzr572; CHECK-NEXT:  .LBB8_5: // %merge_private_za573; CHECK-NEXT:    sub x8, x29, #16574; CHECK-NEXT:    msr TPIDR2_EL0, x8575; CHECK-NEXT:    bl private_za_call576; CHECK-NEXT:    smstart za577; CHECK-NEXT:    mrs x8, TPIDR2_EL0578; CHECK-NEXT:    sub x0, x29, #16579; CHECK-NEXT:    cbnz x8, .LBB8_7580; CHECK-NEXT:  // %bb.6: // %merge_private_za581; CHECK-NEXT:    bl __arm_tpidr2_restore582; CHECK-NEXT:  .LBB8_7: // %merge_private_za583; CHECK-NEXT:    msr TPIDR2_EL0, xzr584; CHECK-NEXT:    mov sp, x29585; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload586; CHECK-NEXT:    ret587;588; CHECK-NEWLOWERING-LABEL: diamond_mixed_za_merge_private:589; CHECK-NEWLOWERING:       // %bb.0: // %entry590; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill591; CHECK-NEWLOWERING-NEXT:    mov x29, sp592; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16593; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1594; CHECK-NEWLOWERING-NEXT:    mov x9, sp595; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9596; CHECK-NEWLOWERING-NEXT:    mov sp, x9597; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]598; CHECK-NEWLOWERING-NEXT:    tbz w0, #0, .LBB8_2599; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %then600; CHECK-NEWLOWERING-NEXT:    bl shared_za_call601; CHECK-NEWLOWERING-NEXT:    sub x8, x29, #16602; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x8603; CHECK-NEWLOWERING-NEXT:    b .LBB8_3604; CHECK-NEWLOWERING-NEXT:  .LBB8_2: // %else605; CHECK-NEWLOWERING-NEXT:    sub x8, x29, #16606; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x8607; CHECK-NEWLOWERING-NEXT:    bl private_za_call608; CHECK-NEWLOWERING-NEXT:  .LBB8_3: // %merge_private_za609; CHECK-NEWLOWERING-NEXT:    bl private_za_call610; CHECK-NEWLOWERING-NEXT:    smstart za611; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0612; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16613; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB8_5614; CHECK-NEWLOWERING-NEXT:  // %bb.4: // %merge_private_za615; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore616; CHECK-NEWLOWERING-NEXT:  .LBB8_5: // %merge_private_za617; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr618; CHECK-NEWLOWERING-NEXT:    mov sp, x29619; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload620; CHECK-NEWLOWERING-NEXT:    ret621entry:622  br i1 %cond, label %then, label %else623 624then:625  call void @shared_za_call()626  br label %merge_private_za627 628else:629  call void @private_za_call()630  br label %merge_private_za631 632merge_private_za:633  call void @private_za_call()634  ret void635}636 637define void @critical_edge_mixed_za(i1 %c1, i1 %c2) "aarch64_inout_za" nounwind {638; CHECK-LABEL: critical_edge_mixed_za:639; CHECK:       // %bb.0: // %entry640; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill641; CHECK-NEXT:    str x19, [sp, #16] // 8-byte Spill642; CHECK-NEXT:    mov x29, sp643; CHECK-NEXT:    sub sp, sp, #16644; CHECK-NEXT:    rdsvl x8, #1645; CHECK-NEXT:    mov x9, sp646; CHECK-NEXT:    mov w19, w1647; CHECK-NEXT:    msub x9, x8, x8, x9648; CHECK-NEXT:    mov sp, x9649; CHECK-NEXT:    stp x9, x8, [x29, #-16]650; CHECK-NEXT:    tbz w0, #0, .LBB9_5651; CHECK-NEXT:  // %bb.1: // %shared_path652; CHECK-NEXT:    bl shared_za_call653; CHECK-NEXT:    tbz w19, #0, .LBB9_8654; CHECK-NEXT:  .LBB9_2: // %exit_private655; CHECK-NEXT:    sub x8, x29, #16656; CHECK-NEXT:    msr TPIDR2_EL0, x8657; CHECK-NEXT:    bl private_za_call658; CHECK-NEXT:    smstart za659; CHECK-NEXT:    mrs x8, TPIDR2_EL0660; CHECK-NEXT:    sub x0, x29, #16661; CHECK-NEXT:    cbnz x8, .LBB9_4662; CHECK-NEXT:  // %bb.3: // %exit_private663; CHECK-NEXT:    bl __arm_tpidr2_restore664; CHECK-NEXT:  .LBB9_4: // %exit_private665; CHECK-NEXT:    msr TPIDR2_EL0, xzr666; CHECK-NEXT:    b .LBB9_9667; CHECK-NEXT:  .LBB9_5: // %private_path668; CHECK-NEXT:    sub x8, x29, #16669; CHECK-NEXT:    msr TPIDR2_EL0, x8670; CHECK-NEXT:    bl private_za_call671; CHECK-NEXT:    smstart za672; CHECK-NEXT:    mrs x8, TPIDR2_EL0673; CHECK-NEXT:    sub x0, x29, #16674; CHECK-NEXT:    cbnz x8, .LBB9_7675; CHECK-NEXT:  // %bb.6: // %private_path676; CHECK-NEXT:    bl __arm_tpidr2_restore677; CHECK-NEXT:  .LBB9_7: // %private_path678; CHECK-NEXT:    msr TPIDR2_EL0, xzr679; CHECK-NEXT:    tbnz w19, #0, .LBB9_2680; CHECK-NEXT:  .LBB9_8: // %exit_shared681; CHECK-NEXT:    bl shared_za_call682; CHECK-NEXT:  .LBB9_9: // %common.ret683; CHECK-NEXT:    mov sp, x29684; CHECK-NEXT:    ldr x19, [sp, #16] // 8-byte Reload685; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload686; CHECK-NEXT:    ret687;688; CHECK-NEWLOWERING-LABEL: critical_edge_mixed_za:689; CHECK-NEWLOWERING:       // %bb.0: // %entry690; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill691; CHECK-NEWLOWERING-NEXT:    str x19, [sp, #16] // 8-byte Spill692; CHECK-NEWLOWERING-NEXT:    mov x29, sp693; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16694; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1695; CHECK-NEWLOWERING-NEXT:    mov x9, sp696; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9697; CHECK-NEWLOWERING-NEXT:    mov sp, x9698; CHECK-NEWLOWERING-NEXT:    mov w19, w1699; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]700; CHECK-NEWLOWERING-NEXT:    tbz w0, #0, .LBB9_5701; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %shared_path702; CHECK-NEWLOWERING-NEXT:    bl shared_za_call703; CHECK-NEWLOWERING-NEXT:    tbz w19, #0, .LBB9_8704; CHECK-NEWLOWERING-NEXT:  .LBB9_2: // %exit_private705; CHECK-NEWLOWERING-NEXT:    sub x8, x29, #16706; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x8707; CHECK-NEWLOWERING-NEXT:    bl private_za_call708; CHECK-NEWLOWERING-NEXT:    smstart za709; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0710; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16711; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB9_4712; CHECK-NEWLOWERING-NEXT:  // %bb.3: // %exit_private713; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore714; CHECK-NEWLOWERING-NEXT:  .LBB9_4: // %exit_private715; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr716; CHECK-NEWLOWERING-NEXT:    b .LBB9_9717; CHECK-NEWLOWERING-NEXT:  .LBB9_5: // %private_path718; CHECK-NEWLOWERING-NEXT:    sub x8, x29, #16719; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x8720; CHECK-NEWLOWERING-NEXT:    bl private_za_call721; CHECK-NEWLOWERING-NEXT:    smstart za722; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0723; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16724; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB9_7725; CHECK-NEWLOWERING-NEXT:  // %bb.6: // %private_path726; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore727; CHECK-NEWLOWERING-NEXT:  .LBB9_7: // %private_path728; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr729; CHECK-NEWLOWERING-NEXT:    tbnz w19, #0, .LBB9_2730; CHECK-NEWLOWERING-NEXT:  .LBB9_8: // %exit_shared731; CHECK-NEWLOWERING-NEXT:    bl shared_za_call732; CHECK-NEWLOWERING-NEXT:  .LBB9_9: // %common.ret733; CHECK-NEWLOWERING-NEXT:    mov sp, x29734; CHECK-NEWLOWERING-NEXT:    ldr x19, [sp, #16] // 8-byte Reload735; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload736; CHECK-NEWLOWERING-NEXT:    ret737entry:738  br i1 %c1, label %shared_path, label %private_path739 740shared_path:741  call void @shared_za_call()742  br label %merge743 744private_path:745  call void @private_za_call()746  br label %merge747 748merge:749  br i1 %c2, label %exit_private, label %exit_shared750 751exit_private:752  call void @private_za_call()753  ret void754 755exit_shared:756  call void @shared_za_call()757  ret void758}759 760define void @nested_cond_in_loop(i32 %n, i1 %cond) "aarch64_inout_za" nounwind {761; CHECK-COMMON-LABEL: nested_cond_in_loop:762; CHECK-COMMON:       // %bb.0: // %entry763; CHECK-COMMON-NEXT:    stp x29, x30, [sp, #-48]! // 16-byte Folded Spill764; CHECK-COMMON-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill765; CHECK-COMMON-NEXT:    mov x29, sp766; CHECK-COMMON-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill767; CHECK-COMMON-NEXT:    sub sp, sp, #16768; CHECK-COMMON-NEXT:    rdsvl x8, #1769; CHECK-COMMON-NEXT:    mov x9, sp770; CHECK-COMMON-NEXT:    msub x9, x8, x8, x9771; CHECK-COMMON-NEXT:    mov sp, x9772; CHECK-COMMON-NEXT:    cmp w0, #1773; CHECK-COMMON-NEXT:    stp x9, x8, [x29, #-16]774; CHECK-COMMON-NEXT:    b.lt .LBB10_8775; CHECK-COMMON-NEXT:  // %bb.1: // %loop.preheader776; CHECK-COMMON-NEXT:    mov w19, w1777; CHECK-COMMON-NEXT:    mov w20, w0778; CHECK-COMMON-NEXT:    mov w21, wzr779; CHECK-COMMON-NEXT:    sub x22, x29, #16780; CHECK-COMMON-NEXT:    b .LBB10_4781; CHECK-COMMON-NEXT:  .LBB10_2: // %use_shared782; CHECK-COMMON-NEXT:    // in Loop: Header=BB10_4 Depth=1783; CHECK-COMMON-NEXT:    bl shared_za_call784; CHECK-COMMON-NEXT:  .LBB10_3: // %latch785; CHECK-COMMON-NEXT:    // in Loop: Header=BB10_4 Depth=1786; CHECK-COMMON-NEXT:    add w21, w21, #1787; CHECK-COMMON-NEXT:    cmp w21, w20788; CHECK-COMMON-NEXT:    b.ge .LBB10_8789; CHECK-COMMON-NEXT:  .LBB10_4: // %loop790; CHECK-COMMON-NEXT:    // =>This Inner Loop Header: Depth=1791; CHECK-COMMON-NEXT:    tbnz w19, #0, .LBB10_2792; CHECK-COMMON-NEXT:  // %bb.5: // %use_private793; CHECK-COMMON-NEXT:    // in Loop: Header=BB10_4 Depth=1794; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, x22795; CHECK-COMMON-NEXT:    bl private_za_call796; CHECK-COMMON-NEXT:    smstart za797; CHECK-COMMON-NEXT:    mrs x8, TPIDR2_EL0798; CHECK-COMMON-NEXT:    sub x0, x29, #16799; CHECK-COMMON-NEXT:    cbnz x8, .LBB10_7800; CHECK-COMMON-NEXT:  // %bb.6: // %use_private801; CHECK-COMMON-NEXT:    // in Loop: Header=BB10_4 Depth=1802; CHECK-COMMON-NEXT:    bl __arm_tpidr2_restore803; CHECK-COMMON-NEXT:  .LBB10_7: // %use_private804; CHECK-COMMON-NEXT:    // in Loop: Header=BB10_4 Depth=1805; CHECK-COMMON-NEXT:    msr TPIDR2_EL0, xzr806; CHECK-COMMON-NEXT:    b .LBB10_3807; CHECK-COMMON-NEXT:  .LBB10_8: // %exit808; CHECK-COMMON-NEXT:    mov sp, x29809; CHECK-COMMON-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload810; CHECK-COMMON-NEXT:    ldp x22, x21, [sp, #16] // 16-byte Folded Reload811; CHECK-COMMON-NEXT:    ldp x29, x30, [sp], #48 // 16-byte Folded Reload812; CHECK-COMMON-NEXT:    ret813entry:814  %cmp = icmp sgt i32 %n, 0815  br i1 %cmp, label %loop, label %exit816 817loop:818  %iv = phi i32 [ 0, %entry ], [ %inc, %latch ]819  br i1 %cond, label %use_shared, label %use_private820 821use_shared:822  call void @shared_za_call()823  br label %latch824 825use_private:826  call void @private_za_call()827  br label %latch828 829latch:830  %inc = add i32 %iv, 1831  %cmp2 = icmp slt i32 %inc, %n832  br i1 %cmp2, label %loop, label %exit833 834exit:835  ret void836}837 838define void @loop_with_external_entry(i1 %c1, i1 %c2) "aarch64_inout_za" nounwind {839; CHECK-LABEL: loop_with_external_entry:840; CHECK:       // %bb.0: // %entry841; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill842; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill843; CHECK-NEXT:    mov x29, sp844; CHECK-NEXT:    sub sp, sp, #16845; CHECK-NEXT:    rdsvl x8, #1846; CHECK-NEXT:    mov x9, sp847; CHECK-NEXT:    mov w19, w1848; CHECK-NEXT:    msub x9, x8, x8, x9849; CHECK-NEXT:    mov sp, x9850; CHECK-NEXT:    stp x9, x8, [x29, #-16]851; CHECK-NEXT:    tbz w0, #0, .LBB11_2852; CHECK-NEXT:  // %bb.1: // %init853; CHECK-NEXT:    bl shared_za_call854; CHECK-NEXT:  .LBB11_2: // %loop.preheader855; CHECK-NEXT:    sub x20, x29, #16856; CHECK-NEXT:    b .LBB11_4857; CHECK-NEXT:  .LBB11_3: // %loop858; CHECK-NEXT:    // in Loop: Header=BB11_4 Depth=1859; CHECK-NEXT:    msr TPIDR2_EL0, xzr860; CHECK-NEXT:    tbz w19, #0, .LBB11_6861; CHECK-NEXT:  .LBB11_4: // %loop862; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1863; CHECK-NEXT:    msr TPIDR2_EL0, x20864; CHECK-NEXT:    bl private_za_call865; CHECK-NEXT:    smstart za866; CHECK-NEXT:    mrs x8, TPIDR2_EL0867; CHECK-NEXT:    sub x0, x29, #16868; CHECK-NEXT:    cbnz x8, .LBB11_3869; CHECK-NEXT:  // %bb.5: // %loop870; CHECK-NEXT:    // in Loop: Header=BB11_4 Depth=1871; CHECK-NEXT:    bl __arm_tpidr2_restore872; CHECK-NEXT:    b .LBB11_3873; CHECK-NEXT:  .LBB11_6: // %exit874; CHECK-NEXT:    mov sp, x29875; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload876; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload877; CHECK-NEXT:    ret878;879; CHECK-NEWLOWERING-LABEL: loop_with_external_entry:880; CHECK-NEWLOWERING:       // %bb.0: // %entry881; CHECK-NEWLOWERING-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill882; CHECK-NEWLOWERING-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill883; CHECK-NEWLOWERING-NEXT:    mov x29, sp884; CHECK-NEWLOWERING-NEXT:    sub sp, sp, #16885; CHECK-NEWLOWERING-NEXT:    rdsvl x8, #1886; CHECK-NEWLOWERING-NEXT:    mov x9, sp887; CHECK-NEWLOWERING-NEXT:    msub x9, x8, x8, x9888; CHECK-NEWLOWERING-NEXT:    mov sp, x9889; CHECK-NEWLOWERING-NEXT:    mov w19, w1890; CHECK-NEWLOWERING-NEXT:    stp x9, x8, [x29, #-16]891; CHECK-NEWLOWERING-NEXT:    tbz w0, #0, .LBB11_2892; CHECK-NEWLOWERING-NEXT:  // %bb.1: // %init893; CHECK-NEWLOWERING-NEXT:    bl shared_za_call894; CHECK-NEWLOWERING-NEXT:  .LBB11_2: // %loop.preheader895; CHECK-NEWLOWERING-NEXT:    sub x20, x29, #16896; CHECK-NEWLOWERING-NEXT:    b .LBB11_4897; CHECK-NEWLOWERING-NEXT:  .LBB11_3: // %loop898; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB11_4 Depth=1899; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, xzr900; CHECK-NEWLOWERING-NEXT:    tbz w19, #0, .LBB11_6901; CHECK-NEWLOWERING-NEXT:  .LBB11_4: // %loop902; CHECK-NEWLOWERING-NEXT:    // =>This Inner Loop Header: Depth=1903; CHECK-NEWLOWERING-NEXT:    msr TPIDR2_EL0, x20904; CHECK-NEWLOWERING-NEXT:    bl private_za_call905; CHECK-NEWLOWERING-NEXT:    smstart za906; CHECK-NEWLOWERING-NEXT:    mrs x8, TPIDR2_EL0907; CHECK-NEWLOWERING-NEXT:    sub x0, x29, #16908; CHECK-NEWLOWERING-NEXT:    cbnz x8, .LBB11_3909; CHECK-NEWLOWERING-NEXT:  // %bb.5: // %loop910; CHECK-NEWLOWERING-NEXT:    // in Loop: Header=BB11_4 Depth=1911; CHECK-NEWLOWERING-NEXT:    bl __arm_tpidr2_restore912; CHECK-NEWLOWERING-NEXT:    b .LBB11_3913; CHECK-NEWLOWERING-NEXT:  .LBB11_6: // %exit914; CHECK-NEWLOWERING-NEXT:    mov sp, x29915; CHECK-NEWLOWERING-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload916; CHECK-NEWLOWERING-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload917; CHECK-NEWLOWERING-NEXT:    ret918entry:919  br i1 %c1, label %init, label %loop920 921init:922  call void @shared_za_call()923  br label %loop924 925loop:926  call void @private_za_call()927  br i1 %c2, label %loop, label %exit928 929exit:930  ret void931}932