brintos

brintos / llvm-project-archived public Read only

0
0
Text · 43.8 KiB · 3947127 Raw
1196 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=+sme2 -aarch64-new-sme-abi -verify-machineinstrs < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-SDAG4 5; A simple EH test case that corresponds to the following C++ source:6;7; struct ZAResource {8;     ~ZAResource() __arm_inout("za") {9;         shared_za_call(); // simulate cleanup in destructor10;     }11; };12;13; void za_with_raii(bool fail) __arm_inout("za") {14;     ZAResource r;15;     if (fail)16;         throw "Unwinding needs ZA state reload";17; }18;19; Here if an exception is thrown we must call the ~ZAResource destructor while20; unwinding the stack. That requires us to restore ZA state before the21; shared_za_call in the cleanup block.22 23@.str = private unnamed_addr constant [32 x i8] c"Unwinding needs ZA state reload\00", align 124@typeinfo_for_char_const_ptr = external constant ptr25 26define void @za_with_raii(i1 %fail) "aarch64_inout_za" personality ptr @__gxx_personality_v0 {27; CHECK-LABEL: za_with_raii:28; CHECK:       .Lfunc_begin0:29; CHECK-NEXT:    .cfi_startproc30; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v031; CHECK-NEXT:    .cfi_lsda 28, .Lexception032; CHECK-NEXT:  // %bb.0:33; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill34; CHECK-NEXT:    str x19, [sp, #16] // 8-byte Spill35; CHECK-NEXT:    mov x29, sp36; CHECK-NEXT:    sub sp, sp, #1637; CHECK-NEXT:    .cfi_def_cfa w29, 3238; CHECK-NEXT:    .cfi_offset w19, -1639; CHECK-NEXT:    .cfi_offset w30, -2440; CHECK-NEXT:    .cfi_offset w29, -3241; CHECK-NEXT:    rdsvl x8, #142; CHECK-NEXT:    mov x9, sp43; CHECK-NEXT:    msub x9, x8, x8, x944; CHECK-NEXT:    mov sp, x945; CHECK-NEXT:    stp x9, x8, [x29, #-16]46; CHECK-NEXT:    tbnz w0, #0, .LBB0_247; CHECK-NEXT:  // %bb.1: // %return_normally48; CHECK-NEXT:    mov sp, x2949; CHECK-NEXT:    ldr x19, [sp, #16] // 8-byte Reload50; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload51; CHECK-NEXT:    b shared_za_call52; CHECK-NEXT:  .LBB0_2: // %throw_exception53; CHECK-NEXT:    sub x8, x29, #1654; CHECK-NEXT:    mov w0, #8 // =0x855; CHECK-NEXT:    msr TPIDR2_EL0, x856; CHECK-NEXT:    bl __cxa_allocate_exception57; CHECK-NEXT:    adrp x8, .L.str58; CHECK-NEXT:    add x8, x8, :lo12:.L.str59; CHECK-NEXT:    str x8, [x0]60; CHECK-NEXT:  .Ltmp0: // EH_LABEL61; CHECK-NEXT:    adrp x1, :got:typeinfo_for_char_const_ptr62; CHECK-NEXT:    mov x2, xzr63; CHECK-NEXT:    ldr x1, [x1, :got_lo12:typeinfo_for_char_const_ptr]64; CHECK-NEXT:    bl __cxa_throw65; CHECK-NEXT:  .Ltmp1: // EH_LABEL66; CHECK-NEXT:  // %bb.3: // %throw_fail67; CHECK-NEXT:  .LBB0_4: // %unwind_dtors68; CHECK-NEXT:  .Ltmp2: // EH_LABEL69; CHECK-NEXT:    mov x19, x070; CHECK-NEXT:    smstart za71; CHECK-NEXT:    mrs x8, TPIDR2_EL072; CHECK-NEXT:    sub x0, x29, #1673; CHECK-NEXT:    cbnz x8, .LBB0_674; CHECK-NEXT:  // %bb.5: // %unwind_dtors75; CHECK-NEXT:    bl __arm_tpidr2_restore76; CHECK-NEXT:  .LBB0_6: // %unwind_dtors77; CHECK-NEXT:    msr TPIDR2_EL0, xzr78; CHECK-NEXT:    bl shared_za_call79; CHECK-NEXT:    sub x8, x29, #1680; CHECK-NEXT:    mov x0, x1981; CHECK-NEXT:    msr TPIDR2_EL0, x882; CHECK-NEXT:    bl _Unwind_Resume83;84; CHECK-SDAG-LABEL: za_with_raii:85; CHECK-SDAG:       .Lfunc_begin0:86; CHECK-SDAG-NEXT:    .cfi_startproc87; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v088; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception089; CHECK-SDAG-NEXT:  // %bb.0:90; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill91; CHECK-SDAG-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill92; CHECK-SDAG-NEXT:    mov x29, sp93; CHECK-SDAG-NEXT:    sub sp, sp, #1694; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 3295; CHECK-SDAG-NEXT:    .cfi_offset w19, -896; CHECK-SDAG-NEXT:    .cfi_offset w20, -1697; CHECK-SDAG-NEXT:    .cfi_offset w30, -2498; CHECK-SDAG-NEXT:    .cfi_offset w29, -3299; CHECK-SDAG-NEXT:    rdsvl x8, #1100; CHECK-SDAG-NEXT:    mov x9, sp101; CHECK-SDAG-NEXT:    msub x9, x8, x8, x9102; CHECK-SDAG-NEXT:    mov sp, x9103; CHECK-SDAG-NEXT:    stp x9, x8, [x29, #-16]104; CHECK-SDAG-NEXT:    tbnz w0, #0, .LBB0_2105; CHECK-SDAG-NEXT:  // %bb.1: // %return_normally106; CHECK-SDAG-NEXT:    mov sp, x29107; CHECK-SDAG-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload108; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload109; CHECK-SDAG-NEXT:    b shared_za_call110; CHECK-SDAG-NEXT:  .LBB0_2: // %throw_exception111; CHECK-SDAG-NEXT:    sub x20, x29, #16112; CHECK-SDAG-NEXT:    mov w0, #8 // =0x8113; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x20114; CHECK-SDAG-NEXT:    bl __cxa_allocate_exception115; CHECK-SDAG-NEXT:    mov x8, x0116; CHECK-SDAG-NEXT:    smstart za117; CHECK-SDAG-NEXT:    mrs x9, TPIDR2_EL0118; CHECK-SDAG-NEXT:    sub x0, x29, #16119; CHECK-SDAG-NEXT:    cbnz x9, .LBB0_4120; CHECK-SDAG-NEXT:  // %bb.3: // %throw_exception121; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore122; CHECK-SDAG-NEXT:  .LBB0_4: // %throw_exception123; CHECK-SDAG-NEXT:    adrp x9, .L.str124; CHECK-SDAG-NEXT:    add x9, x9, :lo12:.L.str125; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr126; CHECK-SDAG-NEXT:    str x9, [x8]127; CHECK-SDAG-NEXT:  .Ltmp0: // EH_LABEL128; CHECK-SDAG-NEXT:    adrp x1, :got:typeinfo_for_char_const_ptr129; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x20130; CHECK-SDAG-NEXT:    mov x0, x8131; CHECK-SDAG-NEXT:    ldr x1, [x1, :got_lo12:typeinfo_for_char_const_ptr]132; CHECK-SDAG-NEXT:    mov x2, xzr133; CHECK-SDAG-NEXT:    bl __cxa_throw134; CHECK-SDAG-NEXT:    smstart za135; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0136; CHECK-SDAG-NEXT:    sub x0, x29, #16137; CHECK-SDAG-NEXT:    cbnz x8, .LBB0_6138; CHECK-SDAG-NEXT:  // %bb.5: // %throw_exception139; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore140; CHECK-SDAG-NEXT:  .LBB0_6: // %throw_exception141; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr142; CHECK-SDAG-NEXT:  .Ltmp1: // EH_LABEL143; CHECK-SDAG-NEXT:  // %bb.7: // %throw_fail144; CHECK-SDAG-NEXT:  .LBB0_8: // %unwind_dtors145; CHECK-SDAG-NEXT:  .Ltmp2: // EH_LABEL146; CHECK-SDAG-NEXT:    mov x19, x0147; CHECK-SDAG-NEXT:    smstart za148; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0149; CHECK-SDAG-NEXT:    sub x0, x29, #16150; CHECK-SDAG-NEXT:    cbnz x8, .LBB0_10151; CHECK-SDAG-NEXT:  // %bb.9: // %unwind_dtors152; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore153; CHECK-SDAG-NEXT:  .LBB0_10: // %unwind_dtors154; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr155; CHECK-SDAG-NEXT:    bl shared_za_call156; CHECK-SDAG-NEXT:    mov x0, x19157; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x20158; CHECK-SDAG-NEXT:    bl _Unwind_Resume159; CHECK-SDAG-NEXT:    smstart za160; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0161; CHECK-SDAG-NEXT:    sub x0, x29, #16162; CHECK-SDAG-NEXT:    cbnz x8, .LBB0_12163; CHECK-SDAG-NEXT:  // %bb.11: // %unwind_dtors164; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore165; CHECK-SDAG-NEXT:  .LBB0_12: // %unwind_dtors166; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr167  br i1 %fail, label %throw_exception, label %return_normally168 169throw_exception:170  %exception_ptr = tail call ptr @__cxa_allocate_exception(i64 8) #3171  store ptr @.str, ptr %exception_ptr, align 16172  invoke void @__cxa_throw(ptr nonnull %exception_ptr, ptr nonnull @typeinfo_for_char_const_ptr, ptr null)173          to label %throw_fail unwind label %unwind_dtors174 175unwind_dtors:176  %5 = landingpad { ptr, i32 }177          cleanup178  tail call void @shared_za_call()179  resume { ptr, i32 } %5180 181return_normally:182  tail call void @shared_za_call()183  ret void184 185throw_fail:186  unreachable187}188 189 190; Another simple exception handling example. Here we need to restore ZA in two191; places. After the may_throw() call to handle the case it does not throw, and192; within the catch block for the shared_za_call(). We also need to setup the193; lazy save around C++ exception ABI routines (to handle the _very_ unlikely194; case they use ZA state).195;196; void za_try_catch() __arm_inout("za") {197;     try {198;         may_throw();199;     } catch (...) {200;        shared_za_call();201;     }202;     shared_za_call();203; }204define void @try_catch() "aarch64_inout_za" personality ptr @__gxx_personality_v0 {205; CHECK-LABEL: try_catch:206; CHECK:       .Lfunc_begin1:207; CHECK-NEXT:    .cfi_startproc208; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0209; CHECK-NEXT:    .cfi_lsda 28, .Lexception1210; CHECK-NEXT:  // %bb.0:211; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill212; CHECK-NEXT:    mov x29, sp213; CHECK-NEXT:    sub sp, sp, #16214; CHECK-NEXT:    .cfi_def_cfa w29, 16215; CHECK-NEXT:    .cfi_offset w30, -8216; CHECK-NEXT:    .cfi_offset w29, -16217; CHECK-NEXT:    rdsvl x8, #1218; CHECK-NEXT:    mov x9, sp219; CHECK-NEXT:    msub x9, x8, x8, x9220; CHECK-NEXT:    mov sp, x9221; CHECK-NEXT:    stp x9, x8, [x29, #-16]222; CHECK-NEXT:  .Ltmp3: // EH_LABEL223; CHECK-NEXT:    sub x8, x29, #16224; CHECK-NEXT:    msr TPIDR2_EL0, x8225; CHECK-NEXT:    bl may_throw226; CHECK-NEXT:  .Ltmp4: // EH_LABEL227; CHECK-NEXT:  .LBB1_1: // %after_catch228; CHECK-NEXT:    smstart za229; CHECK-NEXT:    mrs x8, TPIDR2_EL0230; CHECK-NEXT:    sub x0, x29, #16231; CHECK-NEXT:    cbnz x8, .LBB1_3232; CHECK-NEXT:  // %bb.2: // %after_catch233; CHECK-NEXT:    bl __arm_tpidr2_restore234; CHECK-NEXT:  .LBB1_3: // %after_catch235; CHECK-NEXT:    msr TPIDR2_EL0, xzr236; CHECK-NEXT:    mov sp, x29237; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload238; CHECK-NEXT:    b shared_za_call239; CHECK-NEXT:  .LBB1_4: // %catch240; CHECK-NEXT:  .Ltmp5: // EH_LABEL241; CHECK-NEXT:    bl __cxa_begin_catch242; CHECK-NEXT:    smstart za243; CHECK-NEXT:    mrs x8, TPIDR2_EL0244; CHECK-NEXT:    sub x0, x29, #16245; CHECK-NEXT:    cbnz x8, .LBB1_6246; CHECK-NEXT:  // %bb.5: // %catch247; CHECK-NEXT:    bl __arm_tpidr2_restore248; CHECK-NEXT:  .LBB1_6: // %catch249; CHECK-NEXT:    msr TPIDR2_EL0, xzr250; CHECK-NEXT:    bl shared_za_call251; CHECK-NEXT:    sub x8, x29, #16252; CHECK-NEXT:    msr TPIDR2_EL0, x8253; CHECK-NEXT:    bl __cxa_end_catch254; CHECK-NEXT:    b .LBB1_1255;256; CHECK-SDAG-LABEL: try_catch:257; CHECK-SDAG:       .Lfunc_begin1:258; CHECK-SDAG-NEXT:    .cfi_startproc259; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0260; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception1261; CHECK-SDAG-NEXT:  // %bb.0:262; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill263; CHECK-SDAG-NEXT:    str x19, [sp, #16] // 8-byte Spill264; CHECK-SDAG-NEXT:    mov x29, sp265; CHECK-SDAG-NEXT:    sub sp, sp, #16266; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 32267; CHECK-SDAG-NEXT:    .cfi_offset w19, -16268; CHECK-SDAG-NEXT:    .cfi_offset w30, -24269; CHECK-SDAG-NEXT:    .cfi_offset w29, -32270; CHECK-SDAG-NEXT:    rdsvl x8, #1271; CHECK-SDAG-NEXT:    mov x9, sp272; CHECK-SDAG-NEXT:    msub x9, x8, x8, x9273; CHECK-SDAG-NEXT:    mov sp, x9274; CHECK-SDAG-NEXT:    stp x9, x8, [x29, #-16]275; CHECK-SDAG-NEXT:  .Ltmp3: // EH_LABEL276; CHECK-SDAG-NEXT:    sub x19, x29, #16277; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19278; CHECK-SDAG-NEXT:    bl may_throw279; CHECK-SDAG-NEXT:    smstart za280; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0281; CHECK-SDAG-NEXT:    sub x0, x29, #16282; CHECK-SDAG-NEXT:    cbnz x8, .LBB1_2283; CHECK-SDAG-NEXT:  // %bb.1:284; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore285; CHECK-SDAG-NEXT:  .LBB1_2:286; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr287; CHECK-SDAG-NEXT:  .Ltmp4: // EH_LABEL288; CHECK-SDAG-NEXT:  .LBB1_3: // %after_catch289; CHECK-SDAG-NEXT:    mov sp, x29290; CHECK-SDAG-NEXT:    ldr x19, [sp, #16] // 8-byte Reload291; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload292; CHECK-SDAG-NEXT:    b shared_za_call293; CHECK-SDAG-NEXT:  .LBB1_4: // %catch294; CHECK-SDAG-NEXT:  .Ltmp5: // EH_LABEL295; CHECK-SDAG-NEXT:    mov x1, x0296; CHECK-SDAG-NEXT:    smstart za297; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0298; CHECK-SDAG-NEXT:    sub x0, x29, #16299; CHECK-SDAG-NEXT:    cbnz x8, .LBB1_6300; CHECK-SDAG-NEXT:  // %bb.5: // %catch301; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore302; CHECK-SDAG-NEXT:  .LBB1_6: // %catch303; CHECK-SDAG-NEXT:    mov x0, x1304; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr305; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19306; CHECK-SDAG-NEXT:    bl __cxa_begin_catch307; CHECK-SDAG-NEXT:    smstart za308; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0309; CHECK-SDAG-NEXT:    sub x0, x29, #16310; CHECK-SDAG-NEXT:    cbnz x8, .LBB1_8311; CHECK-SDAG-NEXT:  // %bb.7: // %catch312; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore313; CHECK-SDAG-NEXT:  .LBB1_8: // %catch314; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr315; CHECK-SDAG-NEXT:    bl shared_za_call316; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19317; CHECK-SDAG-NEXT:    bl __cxa_end_catch318; CHECK-SDAG-NEXT:    smstart za319; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0320; CHECK-SDAG-NEXT:    sub x0, x29, #16321; CHECK-SDAG-NEXT:    cbnz x8, .LBB1_10322; CHECK-SDAG-NEXT:  // %bb.9: // %catch323; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore324; CHECK-SDAG-NEXT:  .LBB1_10: // %catch325; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr326; CHECK-SDAG-NEXT:    b .LBB1_3327  invoke void @may_throw()328          to label %after_catch unwind label %catch329 330catch:                                                ; preds = %0331  %eh_info = landingpad { ptr, i32 }332          catch ptr null333  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0334  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)335  tail call void @shared_za_call()336  tail call void @__cxa_end_catch()337  br label %after_catch338 339after_catch:340  tail call void @shared_za_call()341  ret void342}343 344; This example corresponds to:345;346; __arm_new("za") void try_catch_shared_za_callee()347; {348;    try {349;        shared_za_call();350;    } catch(...) {351;        noexcept_shared_za_call();352;    }353; }354;355; In this example we don't setup a lazy save before shared_za_call(), however,356; we still enter the catch block in a ZA off state. This leads to us emitting a357; restore of a uninitialized save buffer in the catch block. This is not ideal358; but is valid in the SME ABI. Ideally, we would omit the save buffer and359; restore and simply set ZA to "on" in the catch block.360 361define void @try_catch_shared_za_callee() "aarch64_new_za" personality ptr @__gxx_personality_v0 {362; CHECK-LABEL: try_catch_shared_za_callee:363; CHECK:       .Lfunc_begin2:364; CHECK-NEXT:    .cfi_startproc365; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0366; CHECK-NEXT:    .cfi_lsda 28, .Lexception2367; CHECK-NEXT:  // %bb.0:368; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill369; CHECK-NEXT:    mov x29, sp370; CHECK-NEXT:    sub sp, sp, #16371; CHECK-NEXT:    .cfi_def_cfa w29, 16372; CHECK-NEXT:    .cfi_offset w30, -8373; CHECK-NEXT:    .cfi_offset w29, -16374; CHECK-NEXT:    rdsvl x8, #1375; CHECK-NEXT:    mov x9, sp376; CHECK-NEXT:    msub x9, x8, x8, x9377; CHECK-NEXT:    mov sp, x9378; CHECK-NEXT:    stp x9, x8, [x29, #-16]379; CHECK-NEXT:    mrs x8, TPIDR2_EL0380; CHECK-NEXT:    cbz x8, .LBB2_2381; CHECK-NEXT:  // %bb.1:382; CHECK-NEXT:    bl __arm_tpidr2_save383; CHECK-NEXT:    msr TPIDR2_EL0, xzr384; CHECK-NEXT:    zero {za}385; CHECK-NEXT:  .LBB2_2:386; CHECK-NEXT:    smstart za387; CHECK-NEXT:  .Ltmp6: // EH_LABEL388; CHECK-NEXT:    bl shared_za_call389; CHECK-NEXT:  .Ltmp7: // EH_LABEL390; CHECK-NEXT:  .LBB2_3: // %exit391; CHECK-NEXT:    smstop za392; CHECK-NEXT:    mov sp, x29393; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload394; CHECK-NEXT:    ret395; CHECK-NEXT:  .LBB2_4: // %catch396; CHECK-NEXT:  .Ltmp8: // EH_LABEL397; CHECK-NEXT:    bl __cxa_begin_catch398; CHECK-NEXT:    smstart za399; CHECK-NEXT:    mrs x8, TPIDR2_EL0400; CHECK-NEXT:    sub x0, x29, #16401; CHECK-NEXT:    cbnz x8, .LBB2_6402; CHECK-NEXT:  // %bb.5: // %catch403; CHECK-NEXT:    bl __arm_tpidr2_restore404; CHECK-NEXT:  .LBB2_6: // %catch405; CHECK-NEXT:    msr TPIDR2_EL0, xzr406; CHECK-NEXT:    bl noexcept_shared_za_call407; CHECK-NEXT:    sub x8, x29, #16408; CHECK-NEXT:    msr TPIDR2_EL0, x8409; CHECK-NEXT:    bl __cxa_end_catch410; CHECK-NEXT:    msr TPIDR2_EL0, xzr411; CHECK-NEXT:    b .LBB2_3412;413; CHECK-SDAG-LABEL: try_catch_shared_za_callee:414; CHECK-SDAG:       .Lfunc_begin2:415; CHECK-SDAG-NEXT:    .cfi_startproc416; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0417; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception2418; CHECK-SDAG-NEXT:  // %bb.0: // %prelude419; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill420; CHECK-SDAG-NEXT:    str x19, [sp, #16] // 8-byte Spill421; CHECK-SDAG-NEXT:    mov x29, sp422; CHECK-SDAG-NEXT:    sub sp, sp, #16423; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 32424; CHECK-SDAG-NEXT:    .cfi_offset w19, -16425; CHECK-SDAG-NEXT:    .cfi_offset w30, -24426; CHECK-SDAG-NEXT:    .cfi_offset w29, -32427; CHECK-SDAG-NEXT:    rdsvl x8, #1428; CHECK-SDAG-NEXT:    mov x9, sp429; CHECK-SDAG-NEXT:    msub x9, x8, x8, x9430; CHECK-SDAG-NEXT:    mov sp, x9431; CHECK-SDAG-NEXT:    stp x9, x8, [x29, #-16]432; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0433; CHECK-SDAG-NEXT:    cbz x8, .LBB2_2434; CHECK-SDAG-NEXT:  // %bb.1: // %save.za435; CHECK-SDAG-NEXT:    bl __arm_tpidr2_save436; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr437; CHECK-SDAG-NEXT:  .LBB2_2:438; CHECK-SDAG-NEXT:    smstart za439; CHECK-SDAG-NEXT:    zero {za}440; CHECK-SDAG-NEXT:  .Ltmp6: // EH_LABEL441; CHECK-SDAG-NEXT:    bl shared_za_call442; CHECK-SDAG-NEXT:  .Ltmp7: // EH_LABEL443; CHECK-SDAG-NEXT:  .LBB2_3: // %exit444; CHECK-SDAG-NEXT:    smstop za445; CHECK-SDAG-NEXT:    mov sp, x29446; CHECK-SDAG-NEXT:    ldr x19, [sp, #16] // 8-byte Reload447; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload448; CHECK-SDAG-NEXT:    ret449; CHECK-SDAG-NEXT:  .LBB2_4: // %catch450; CHECK-SDAG-NEXT:  .Ltmp8: // EH_LABEL451; CHECK-SDAG-NEXT:    mov x1, x0452; CHECK-SDAG-NEXT:    smstart za453; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0454; CHECK-SDAG-NEXT:    sub x0, x29, #16455; CHECK-SDAG-NEXT:    sub x19, x29, #16456; CHECK-SDAG-NEXT:    cbnz x8, .LBB2_6457; CHECK-SDAG-NEXT:  // %bb.5: // %catch458; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore459; CHECK-SDAG-NEXT:  .LBB2_6: // %catch460; CHECK-SDAG-NEXT:    mov x0, x1461; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr462; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19463; CHECK-SDAG-NEXT:    bl __cxa_begin_catch464; CHECK-SDAG-NEXT:    smstart za465; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0466; CHECK-SDAG-NEXT:    sub x0, x29, #16467; CHECK-SDAG-NEXT:    cbnz x8, .LBB2_8468; CHECK-SDAG-NEXT:  // %bb.7: // %catch469; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore470; CHECK-SDAG-NEXT:  .LBB2_8: // %catch471; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr472; CHECK-SDAG-NEXT:    bl noexcept_shared_za_call473; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19474; CHECK-SDAG-NEXT:    bl __cxa_end_catch475; CHECK-SDAG-NEXT:    smstart za476; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0477; CHECK-SDAG-NEXT:    sub x0, x29, #16478; CHECK-SDAG-NEXT:    cbnz x8, .LBB2_10479; CHECK-SDAG-NEXT:  // %bb.9: // %catch480; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore481; CHECK-SDAG-NEXT:  .LBB2_10: // %catch482; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr483; CHECK-SDAG-NEXT:    b .LBB2_3484  invoke void @shared_za_call() #4485          to label %exit unwind label %catch486catch:487  %eh_info = landingpad { ptr, i32 }488          catch ptr null489  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0490  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)491  tail call void @noexcept_shared_za_call()492  tail call void @__cxa_end_catch()493  br label %exit494 495exit:496  ret void497}498 499; A simple ZT0 exception example that corresponds to:500;501; struct ZT0Resource {502;     ~ZT0Resource() __arm_inout("zt0") {503;         shared_zt0_call(); // simulate cleanup in destructor504;     }505; };506;507; void za_with_raii() __arm_inout("zt0") {508;     ZT0Resource r;509;     may_throw();510; }511;512; This code may require reloading ZT0 in the cleanup for ~ZT0Resource().513;514define void @try_catch_shared_zt0_callee() "aarch64_inout_zt0" personality ptr @__gxx_personality_v0 {515; CHECK-LABEL: try_catch_shared_zt0_callee:516; CHECK:       .Lfunc_begin3:517; CHECK-NEXT:    .cfi_startproc518; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0519; CHECK-NEXT:    .cfi_lsda 28, .Lexception3520; CHECK-NEXT:  // %bb.0:521; CHECK-NEXT:    sub sp, sp, #96522; CHECK-NEXT:    str x30, [sp, #64] // 8-byte Spill523; CHECK-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill524; CHECK-NEXT:    .cfi_def_cfa_offset 96525; CHECK-NEXT:    .cfi_offset w19, -8526; CHECK-NEXT:    .cfi_offset w20, -16527; CHECK-NEXT:    .cfi_offset w30, -32528; CHECK-NEXT:  .Ltmp9: // EH_LABEL529; CHECK-NEXT:    mov x19, sp530; CHECK-NEXT:    str zt0, [x19]531; CHECK-NEXT:    smstop za532; CHECK-NEXT:    bl may_throw533; CHECK-NEXT:  .Ltmp10: // EH_LABEL534; CHECK-NEXT:    smstart za535; CHECK-NEXT:    ldr zt0, [x19]536; CHECK-NEXT:  // %bb.1: // %return_normally537; CHECK-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload538; CHECK-NEXT:    ldr x30, [sp, #64] // 8-byte Reload539; CHECK-NEXT:    add sp, sp, #96540; CHECK-NEXT:    ret541; CHECK-NEXT:  .LBB3_2: // %unwind_dtors542; CHECK-NEXT:  .Ltmp11: // EH_LABEL543; CHECK-NEXT:    mov x20, sp544; CHECK-NEXT:    mov x19, x0545; CHECK-NEXT:    smstart za546; CHECK-NEXT:    ldr zt0, [x20]547; CHECK-NEXT:    bl shared_zt0_call548; CHECK-NEXT:    str zt0, [x20]549; CHECK-NEXT:    smstop za550; CHECK-NEXT:    mov x0, x19551; CHECK-NEXT:    bl _Unwind_Resume552;553; CHECK-SDAG-LABEL: try_catch_shared_zt0_callee:554; CHECK-SDAG:       .Lfunc_begin3:555; CHECK-SDAG-NEXT:    .cfi_startproc556; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0557; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception3558; CHECK-SDAG-NEXT:  // %bb.0:559; CHECK-SDAG-NEXT:    sub sp, sp, #96560; CHECK-SDAG-NEXT:    str x30, [sp, #64] // 8-byte Spill561; CHECK-SDAG-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill562; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 96563; CHECK-SDAG-NEXT:    .cfi_offset w19, -8564; CHECK-SDAG-NEXT:    .cfi_offset w20, -16565; CHECK-SDAG-NEXT:    .cfi_offset w30, -32566; CHECK-SDAG-NEXT:  .Ltmp9: // EH_LABEL567; CHECK-SDAG-NEXT:    mov x19, sp568; CHECK-SDAG-NEXT:    str zt0, [x19]569; CHECK-SDAG-NEXT:    smstop za570; CHECK-SDAG-NEXT:    bl may_throw571; CHECK-SDAG-NEXT:    smstart za572; CHECK-SDAG-NEXT:    ldr zt0, [x19]573; CHECK-SDAG-NEXT:  .Ltmp10: // EH_LABEL574; CHECK-SDAG-NEXT:  // %bb.1: // %return_normally575; CHECK-SDAG-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload576; CHECK-SDAG-NEXT:    ldr x30, [sp, #64] // 8-byte Reload577; CHECK-SDAG-NEXT:    add sp, sp, #96578; CHECK-SDAG-NEXT:    ret579; CHECK-SDAG-NEXT:  .LBB3_2: // %unwind_dtors580; CHECK-SDAG-NEXT:  .Ltmp11: // EH_LABEL581; CHECK-SDAG-NEXT:    mov x20, sp582; CHECK-SDAG-NEXT:    mov x19, x0583; CHECK-SDAG-NEXT:    smstart za584; CHECK-SDAG-NEXT:    ldr zt0, [x20]585; CHECK-SDAG-NEXT:    bl shared_zt0_call586; CHECK-SDAG-NEXT:    str zt0, [x20]587; CHECK-SDAG-NEXT:    smstop za588; CHECK-SDAG-NEXT:    mov x0, x19589; CHECK-SDAG-NEXT:    bl _Unwind_Resume590; CHECK-SDAG-NEXT:    smstart za591; CHECK-SDAG-NEXT:    ldr zt0, [x20]592  invoke void @may_throw()593          to label %return_normally unwind label %unwind_dtors594 595unwind_dtors:596  %5 = landingpad { ptr, i32 }597          cleanup598  tail call void @shared_zt0_call()599  resume { ptr, i32 } %5600 601return_normally:602  ret void603}604 605; This example corresponds to:606;607; __arm_agnostic("sme_za_state") void try_catch_agnostic_za()608; {609;    try {610;        may_throw();611;    } catch(...) {612;    }613; }614;615; In this example we must execute __arm_sme_restore once we enter the catch block616; (before executing __arm_sme_save again, which would invalidate the prior save).617define void @try_catch_agnostic_za() "aarch64_za_state_agnostic" personality ptr @__gxx_personality_v0 {618; CHECK-LABEL: try_catch_agnostic_za:619; CHECK:       .Lfunc_begin4:620; CHECK-NEXT:    .cfi_startproc621; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0622; CHECK-NEXT:    .cfi_lsda 28, .Lexception4623; CHECK-NEXT:  // %bb.0:624; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill625; CHECK-NEXT:    str x19, [sp, #16] // 8-byte Spill626; CHECK-NEXT:    mov x29, sp627; CHECK-NEXT:    .cfi_def_cfa w29, 32628; CHECK-NEXT:    .cfi_offset w19, -16629; CHECK-NEXT:    .cfi_offset w30, -24630; CHECK-NEXT:    .cfi_offset w29, -32631; CHECK-NEXT:    bl __arm_sme_state_size632; CHECK-NEXT:    sub sp, sp, x0633; CHECK-NEXT:    mov x19, sp634; CHECK-NEXT:  .Ltmp12: // EH_LABEL635; CHECK-NEXT:    mov x0, x19636; CHECK-NEXT:    bl __arm_sme_save637; CHECK-NEXT:    bl may_throw638; CHECK-NEXT:  .Ltmp13: // EH_LABEL639; CHECK-NEXT:  .LBB4_1: // %exit640; CHECK-NEXT:    mov x0, x19641; CHECK-NEXT:    bl __arm_sme_restore642; CHECK-NEXT:    mov sp, x29643; CHECK-NEXT:    ldr x19, [sp, #16] // 8-byte Reload644; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload645; CHECK-NEXT:    ret646; CHECK-NEXT:  .LBB4_2: // %catch647; CHECK-NEXT:  .Ltmp14: // EH_LABEL648; CHECK-NEXT:    bl __cxa_begin_catch649; CHECK-NEXT:    bl __cxa_end_catch650; CHECK-NEXT:    b .LBB4_1651;652; CHECK-SDAG-LABEL: try_catch_agnostic_za:653; CHECK-SDAG:       .Lfunc_begin4:654; CHECK-SDAG-NEXT:    .cfi_startproc655; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0656; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception4657; CHECK-SDAG-NEXT:  // %bb.0:658; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill659; CHECK-SDAG-NEXT:    str x19, [sp, #16] // 8-byte Spill660; CHECK-SDAG-NEXT:    mov x29, sp661; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 32662; CHECK-SDAG-NEXT:    .cfi_offset w19, -16663; CHECK-SDAG-NEXT:    .cfi_offset w30, -24664; CHECK-SDAG-NEXT:    .cfi_offset w29, -32665; CHECK-SDAG-NEXT:    bl __arm_sme_state_size666; CHECK-SDAG-NEXT:    sub sp, sp, x0667; CHECK-SDAG-NEXT:    mov x19, sp668; CHECK-SDAG-NEXT:  .Ltmp12: // EH_LABEL669; CHECK-SDAG-NEXT:    mov x0, x19670; CHECK-SDAG-NEXT:    bl __arm_sme_save671; CHECK-SDAG-NEXT:    bl may_throw672; CHECK-SDAG-NEXT:    mov x0, x19673; CHECK-SDAG-NEXT:    bl __arm_sme_restore674; CHECK-SDAG-NEXT:  .Ltmp13: // EH_LABEL675; CHECK-SDAG-NEXT:  .LBB4_1: // %exit676; CHECK-SDAG-NEXT:    mov sp, x29677; CHECK-SDAG-NEXT:    ldr x19, [sp, #16] // 8-byte Reload678; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload679; CHECK-SDAG-NEXT:    ret680; CHECK-SDAG-NEXT:  .LBB4_2: // %catch681; CHECK-SDAG-NEXT:  .Ltmp14: // EH_LABEL682; CHECK-SDAG-NEXT:    mov x1, x0683; CHECK-SDAG-NEXT:    mov x0, x19684; CHECK-SDAG-NEXT:    bl __arm_sme_restore685; CHECK-SDAG-NEXT:    mov x0, x19686; CHECK-SDAG-NEXT:    bl __arm_sme_save687; CHECK-SDAG-NEXT:    mov x0, x1688; CHECK-SDAG-NEXT:    bl __cxa_begin_catch689; CHECK-SDAG-NEXT:    mov x0, x19690; CHECK-SDAG-NEXT:    bl __arm_sme_restore691; CHECK-SDAG-NEXT:    mov x0, x19692; CHECK-SDAG-NEXT:    bl __arm_sme_save693; CHECK-SDAG-NEXT:    bl __cxa_end_catch694; CHECK-SDAG-NEXT:    mov x0, x19695; CHECK-SDAG-NEXT:    bl __arm_sme_restore696; CHECK-SDAG-NEXT:    b .LBB4_1697  invoke void @may_throw()698          to label %exit unwind label %catch699catch:700  %eh_info = landingpad { ptr, i32 }701          catch ptr null702  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0703  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)704  tail call void @__cxa_end_catch()705  br label %exit706 707exit:708  ret void709}710 711; This example corresponds to:712;713; __arm_agnostic("sme_za_state") void try_catch_agnostic_za_invoke()714; {715;    try {716;        agnostic_za_call();717;    } catch(...) {718;    }719; }720;721; In this example we preserve all SME state enabled by PSTATE.ZA using722; `__arm_sme_save` before agnostic_za_call(). This is because on all normal723; returns from an agnostic ZA function ZA state should be preserved. That means724; we need to make sure ZA state is saved in case agnostic_za_call() throws, and725; we need to restore ZA state after unwinding to the catch block.726 727define void @try_catch_agnostic_za_invoke() "aarch64_za_state_agnostic" personality ptr @__gxx_personality_v0 {728; CHECK-LABEL: try_catch_agnostic_za_invoke:729; CHECK:       .Lfunc_begin5:730; CHECK-NEXT:    .cfi_startproc731; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0732; CHECK-NEXT:    .cfi_lsda 28, .Lexception5733; CHECK-NEXT:  // %bb.0: // %entry734; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill735; CHECK-NEXT:    str x19, [sp, #16] // 8-byte Spill736; CHECK-NEXT:    mov x29, sp737; CHECK-NEXT:    .cfi_def_cfa w29, 32738; CHECK-NEXT:    .cfi_offset w19, -16739; CHECK-NEXT:    .cfi_offset w30, -24740; CHECK-NEXT:    .cfi_offset w29, -32741; CHECK-NEXT:    bl __arm_sme_state_size742; CHECK-NEXT:    sub sp, sp, x0743; CHECK-NEXT:    mov x19, sp744; CHECK-NEXT:  .Ltmp15: // EH_LABEL745; CHECK-NEXT:    mov x0, x19746; CHECK-NEXT:    bl __arm_sme_save747; CHECK-NEXT:    bl agnostic_za_call748; CHECK-NEXT:  .Ltmp16: // EH_LABEL749; CHECK-NEXT:  .LBB5_1: // %exit750; CHECK-NEXT:    mov x0, x19751; CHECK-NEXT:    bl __arm_sme_restore752; CHECK-NEXT:    mov sp, x29753; CHECK-NEXT:    ldr x19, [sp, #16] // 8-byte Reload754; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload755; CHECK-NEXT:    ret756; CHECK-NEXT:  .LBB5_2: // %catch757; CHECK-NEXT:  .Ltmp17: // EH_LABEL758; CHECK-NEXT:    bl __cxa_begin_catch759; CHECK-NEXT:    bl __cxa_end_catch760; CHECK-NEXT:    b .LBB5_1761;762; CHECK-SDAG-LABEL: try_catch_agnostic_za_invoke:763; CHECK-SDAG:       .Lfunc_begin5:764; CHECK-SDAG-NEXT:    .cfi_startproc765; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0766; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception5767; CHECK-SDAG-NEXT:  // %bb.0: // %entry768; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill769; CHECK-SDAG-NEXT:    str x19, [sp, #16] // 8-byte Spill770; CHECK-SDAG-NEXT:    mov x29, sp771; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 32772; CHECK-SDAG-NEXT:    .cfi_offset w19, -16773; CHECK-SDAG-NEXT:    .cfi_offset w30, -24774; CHECK-SDAG-NEXT:    .cfi_offset w29, -32775; CHECK-SDAG-NEXT:    bl __arm_sme_state_size776; CHECK-SDAG-NEXT:    sub sp, sp, x0777; CHECK-SDAG-NEXT:    mov x19, sp778; CHECK-SDAG-NEXT:  .Ltmp15: // EH_LABEL779; CHECK-SDAG-NEXT:    mov x0, x19780; CHECK-SDAG-NEXT:    bl __arm_sme_save781; CHECK-SDAG-NEXT:    bl agnostic_za_call782; CHECK-SDAG-NEXT:    mov x0, x19783; CHECK-SDAG-NEXT:    bl __arm_sme_restore784; CHECK-SDAG-NEXT:  .Ltmp16: // EH_LABEL785; CHECK-SDAG-NEXT:  .LBB5_1: // %exit786; CHECK-SDAG-NEXT:    mov sp, x29787; CHECK-SDAG-NEXT:    ldr x19, [sp, #16] // 8-byte Reload788; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload789; CHECK-SDAG-NEXT:    ret790; CHECK-SDAG-NEXT:  .LBB5_2: // %catch791; CHECK-SDAG-NEXT:  .Ltmp17: // EH_LABEL792; CHECK-SDAG-NEXT:    mov x1, x0793; CHECK-SDAG-NEXT:    mov x0, x19794; CHECK-SDAG-NEXT:    bl __arm_sme_restore795; CHECK-SDAG-NEXT:    mov x0, x19796; CHECK-SDAG-NEXT:    bl __arm_sme_save797; CHECK-SDAG-NEXT:    mov x0, x1798; CHECK-SDAG-NEXT:    bl __cxa_begin_catch799; CHECK-SDAG-NEXT:    mov x0, x19800; CHECK-SDAG-NEXT:    bl __arm_sme_restore801; CHECK-SDAG-NEXT:    mov x0, x19802; CHECK-SDAG-NEXT:    bl __arm_sme_save803; CHECK-SDAG-NEXT:    bl __cxa_end_catch804; CHECK-SDAG-NEXT:    mov x0, x19805; CHECK-SDAG-NEXT:    bl __arm_sme_restore806; CHECK-SDAG-NEXT:    b .LBB5_1807entry:808  invoke void @agnostic_za_call() "aarch64_za_state_agnostic"809          to label %exit unwind label %catch810 811catch:812  %eh_info = landingpad { ptr, i32 }813          catch ptr null814  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0815  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)816  tail call void @__cxa_end_catch()817  br label %exit818 819exit:820  ret void821}822 823; This is the same `try_catch_agnostic_za_invoke`, but shows a lazy save would824; also need to be committed in a shared-ZA function calling an agnostic-ZA function.825define void @try_catch_inout_za_agnostic_za_callee() "aarch64_inout_za" personality ptr @__gxx_personality_v0 {826; CHECK-LABEL: try_catch_inout_za_agnostic_za_callee:827; CHECK:       .Lfunc_begin6:828; CHECK-NEXT:    .cfi_startproc829; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0830; CHECK-NEXT:    .cfi_lsda 28, .Lexception6831; CHECK-NEXT:  // %bb.0: // %entry832; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill833; CHECK-NEXT:    mov x29, sp834; CHECK-NEXT:    sub sp, sp, #16835; CHECK-NEXT:    .cfi_def_cfa w29, 16836; CHECK-NEXT:    .cfi_offset w30, -8837; CHECK-NEXT:    .cfi_offset w29, -16838; CHECK-NEXT:    rdsvl x8, #1839; CHECK-NEXT:    mov x9, sp840; CHECK-NEXT:    msub x9, x8, x8, x9841; CHECK-NEXT:    mov sp, x9842; CHECK-NEXT:    stp x9, x8, [x29, #-16]843; CHECK-NEXT:  .Ltmp18: // EH_LABEL844; CHECK-NEXT:    sub x8, x29, #16845; CHECK-NEXT:    msr TPIDR2_EL0, x8846; CHECK-NEXT:    bl agnostic_za_call847; CHECK-NEXT:  .Ltmp19: // EH_LABEL848; CHECK-NEXT:  .LBB6_1: // %exit849; CHECK-NEXT:    smstart za850; CHECK-NEXT:    mrs x8, TPIDR2_EL0851; CHECK-NEXT:    sub x0, x29, #16852; CHECK-NEXT:    cbnz x8, .LBB6_3853; CHECK-NEXT:  // %bb.2: // %exit854; CHECK-NEXT:    bl __arm_tpidr2_restore855; CHECK-NEXT:  .LBB6_3: // %exit856; CHECK-NEXT:    msr TPIDR2_EL0, xzr857; CHECK-NEXT:    mov sp, x29858; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload859; CHECK-NEXT:    ret860; CHECK-NEXT:  .LBB6_4: // %catch861; CHECK-NEXT:  .Ltmp20: // EH_LABEL862; CHECK-NEXT:    bl __cxa_begin_catch863; CHECK-NEXT:    bl __cxa_end_catch864; CHECK-NEXT:    b .LBB6_1865;866; CHECK-SDAG-LABEL: try_catch_inout_za_agnostic_za_callee:867; CHECK-SDAG:       .Lfunc_begin6:868; CHECK-SDAG-NEXT:    .cfi_startproc869; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0870; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception6871; CHECK-SDAG-NEXT:  // %bb.0: // %entry872; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill873; CHECK-SDAG-NEXT:    str x19, [sp, #16] // 8-byte Spill874; CHECK-SDAG-NEXT:    mov x29, sp875; CHECK-SDAG-NEXT:    sub sp, sp, #16876; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 32877; CHECK-SDAG-NEXT:    .cfi_offset w19, -16878; CHECK-SDAG-NEXT:    .cfi_offset w30, -24879; CHECK-SDAG-NEXT:    .cfi_offset w29, -32880; CHECK-SDAG-NEXT:    rdsvl x8, #1881; CHECK-SDAG-NEXT:    mov x9, sp882; CHECK-SDAG-NEXT:    msub x9, x8, x8, x9883; CHECK-SDAG-NEXT:    mov sp, x9884; CHECK-SDAG-NEXT:    stp x9, x8, [x29, #-16]885; CHECK-SDAG-NEXT:  .Ltmp18: // EH_LABEL886; CHECK-SDAG-NEXT:    sub x19, x29, #16887; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19888; CHECK-SDAG-NEXT:    bl agnostic_za_call889; CHECK-SDAG-NEXT:    smstart za890; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0891; CHECK-SDAG-NEXT:    sub x0, x29, #16892; CHECK-SDAG-NEXT:    cbnz x8, .LBB6_2893; CHECK-SDAG-NEXT:  // %bb.1: // %entry894; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore895; CHECK-SDAG-NEXT:  .LBB6_2: // %entry896; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr897; CHECK-SDAG-NEXT:  .Ltmp19: // EH_LABEL898; CHECK-SDAG-NEXT:  .LBB6_3: // %exit899; CHECK-SDAG-NEXT:    mov sp, x29900; CHECK-SDAG-NEXT:    ldr x19, [sp, #16] // 8-byte Reload901; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload902; CHECK-SDAG-NEXT:    ret903; CHECK-SDAG-NEXT:  .LBB6_4: // %catch904; CHECK-SDAG-NEXT:  .Ltmp20: // EH_LABEL905; CHECK-SDAG-NEXT:    mov x1, x0906; CHECK-SDAG-NEXT:    smstart za907; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0908; CHECK-SDAG-NEXT:    sub x0, x29, #16909; CHECK-SDAG-NEXT:    cbnz x8, .LBB6_6910; CHECK-SDAG-NEXT:  // %bb.5: // %catch911; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore912; CHECK-SDAG-NEXT:  .LBB6_6: // %catch913; CHECK-SDAG-NEXT:    mov x0, x1914; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr915; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19916; CHECK-SDAG-NEXT:    bl __cxa_begin_catch917; CHECK-SDAG-NEXT:    smstart za918; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0919; CHECK-SDAG-NEXT:    sub x0, x29, #16920; CHECK-SDAG-NEXT:    cbnz x8, .LBB6_8921; CHECK-SDAG-NEXT:  // %bb.7: // %catch922; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore923; CHECK-SDAG-NEXT:  .LBB6_8: // %catch924; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr925; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x19926; CHECK-SDAG-NEXT:    bl __cxa_end_catch927; CHECK-SDAG-NEXT:    smstart za928; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL0929; CHECK-SDAG-NEXT:    sub x0, x29, #16930; CHECK-SDAG-NEXT:    cbnz x8, .LBB6_10931; CHECK-SDAG-NEXT:  // %bb.9: // %catch932; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore933; CHECK-SDAG-NEXT:  .LBB6_10: // %catch934; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr935; CHECK-SDAG-NEXT:    b .LBB6_3936entry:937  invoke void @agnostic_za_call()938          to label %exit unwind label %catch939 940catch:941  %eh_info = landingpad { ptr, i32 }942          catch ptr null943  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0944  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)945  tail call void @__cxa_end_catch()946  br label %exit947 948exit:949  ret void950}951 952define void @try_catch_inout_zt0() "aarch64_inout_zt0" personality ptr @__gxx_personality_v0 {953; CHECK-LABEL: try_catch_inout_zt0:954; CHECK:       .Lfunc_begin7:955; CHECK-NEXT:    .cfi_startproc956; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0957; CHECK-NEXT:    .cfi_lsda 28, .Lexception7958; CHECK-NEXT:  // %bb.0: // %entry959; CHECK-NEXT:    sub sp, sp, #80960; CHECK-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill961; CHECK-NEXT:    .cfi_def_cfa_offset 80962; CHECK-NEXT:    .cfi_offset w19, -8963; CHECK-NEXT:    .cfi_offset w30, -16964; CHECK-NEXT:  .Ltmp21: // EH_LABEL965; CHECK-NEXT:    mov x19, sp966; CHECK-NEXT:    str zt0, [x19]967; CHECK-NEXT:    smstop za968; CHECK-NEXT:    bl may_throw969; CHECK-NEXT:  .Ltmp22: // EH_LABEL970; CHECK-NEXT:  .LBB7_1: // %exit971; CHECK-NEXT:    smstart za972; CHECK-NEXT:    ldr zt0, [x19]973; CHECK-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload974; CHECK-NEXT:    add sp, sp, #80975; CHECK-NEXT:    ret976; CHECK-NEXT:  .LBB7_2: // %catch977; CHECK-NEXT:  .Ltmp23: // EH_LABEL978; CHECK-NEXT:    bl __cxa_begin_catch979; CHECK-NEXT:    bl __cxa_end_catch980; CHECK-NEXT:    b .LBB7_1981;982; CHECK-SDAG-LABEL: try_catch_inout_zt0:983; CHECK-SDAG:       .Lfunc_begin7:984; CHECK-SDAG-NEXT:    .cfi_startproc985; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v0986; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception7987; CHECK-SDAG-NEXT:  // %bb.0: // %entry988; CHECK-SDAG-NEXT:    sub sp, sp, #80989; CHECK-SDAG-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill990; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 80991; CHECK-SDAG-NEXT:    .cfi_offset w19, -8992; CHECK-SDAG-NEXT:    .cfi_offset w30, -16993; CHECK-SDAG-NEXT:  .Ltmp21: // EH_LABEL994; CHECK-SDAG-NEXT:    mov x19, sp995; CHECK-SDAG-NEXT:    str zt0, [x19]996; CHECK-SDAG-NEXT:    smstop za997; CHECK-SDAG-NEXT:    bl may_throw998; CHECK-SDAG-NEXT:    smstart za999; CHECK-SDAG-NEXT:    ldr zt0, [x19]1000; CHECK-SDAG-NEXT:  .Ltmp22: // EH_LABEL1001; CHECK-SDAG-NEXT:  .LBB7_1: // %exit1002; CHECK-SDAG-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload1003; CHECK-SDAG-NEXT:    add sp, sp, #801004; CHECK-SDAG-NEXT:    ret1005; CHECK-SDAG-NEXT:  .LBB7_2: // %catch1006; CHECK-SDAG-NEXT:  .Ltmp23: // EH_LABEL1007; CHECK-SDAG-NEXT:    smstart za1008; CHECK-SDAG-NEXT:    ldr zt0, [x19]1009; CHECK-SDAG-NEXT:    str zt0, [x19]1010; CHECK-SDAG-NEXT:    smstop za1011; CHECK-SDAG-NEXT:    bl __cxa_begin_catch1012; CHECK-SDAG-NEXT:    smstart za1013; CHECK-SDAG-NEXT:    ldr zt0, [x19]1014; CHECK-SDAG-NEXT:    str zt0, [x19]1015; CHECK-SDAG-NEXT:    smstop za1016; CHECK-SDAG-NEXT:    bl __cxa_end_catch1017; CHECK-SDAG-NEXT:    smstart za1018; CHECK-SDAG-NEXT:    ldr zt0, [x19]1019; CHECK-SDAG-NEXT:    b .LBB7_11020entry:1021  invoke void @may_throw()1022          to label %exit unwind label %catch1023 1024catch:1025  %eh_info = landingpad { ptr, i32 }1026          catch ptr null1027  %exception_ptr = extractvalue { ptr, i32 } %eh_info, 01028  tail call ptr @__cxa_begin_catch(ptr %exception_ptr)1029  tail call void @__cxa_end_catch()1030  br label %exit1031 1032exit:1033  ret void1034}1035 1036define void @try_catch_shared_za_callee_zt0_saved(ptr %callee) "aarch64_inout_za" "aarch64_in_zt0" personality ptr @__gxx_personality_v0 {1037; CHECK-LABEL: try_catch_shared_za_callee_zt0_saved:1038; CHECK:       .Lfunc_begin8:1039; CHECK-NEXT:    .cfi_startproc1040; CHECK-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v01041; CHECK-NEXT:    .cfi_lsda 28, .Lexception81042; CHECK-NEXT:  // %bb.0:1043; CHECK-NEXT:    stp x29, x30, [sp, #-32]! // 16-byte Folded Spill1044; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill1045; CHECK-NEXT:    mov x29, sp1046; CHECK-NEXT:    sub sp, sp, #801047; CHECK-NEXT:    .cfi_def_cfa w29, 321048; CHECK-NEXT:    .cfi_offset w19, -81049; CHECK-NEXT:    .cfi_offset w20, -161050; CHECK-NEXT:    .cfi_offset w30, -241051; CHECK-NEXT:    .cfi_offset w29, -321052; CHECK-NEXT:    rdsvl x8, #11053; CHECK-NEXT:    mov x9, sp1054; CHECK-NEXT:    msub x9, x8, x8, x91055; CHECK-NEXT:    mov sp, x91056; CHECK-NEXT:    mov x19, x01057; CHECK-NEXT:    stp x9, x8, [x29, #-80]1058; CHECK-NEXT:  .Ltmp24: // EH_LABEL1059; CHECK-NEXT:    sub x20, x29, #641060; CHECK-NEXT:    sub x8, x29, #801061; CHECK-NEXT:    str zt0, [x20]1062; CHECK-NEXT:    msr TPIDR2_EL0, x81063; CHECK-NEXT:    bl may_throw1064; CHECK-NEXT:  .Ltmp25: // EH_LABEL1065; CHECK-NEXT:    smstart za1066; CHECK-NEXT:    mrs x8, TPIDR2_EL01067; CHECK-NEXT:    sub x0, x29, #801068; CHECK-NEXT:    cbnz x8, .LBB8_21069; CHECK-NEXT:  // %bb.1:1070; CHECK-NEXT:    bl __arm_tpidr2_restore1071; CHECK-NEXT:  .LBB8_2:1072; CHECK-NEXT:    msr TPIDR2_EL0, xzr1073; CHECK-NEXT:    ldr zt0, [x20]1074; CHECK-NEXT:  // %bb.3: // %return_normally1075; CHECK-NEXT:    mov sp, x291076; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload1077; CHECK-NEXT:    ldp x29, x30, [sp], #32 // 16-byte Folded Reload1078; CHECK-NEXT:    ret1079; CHECK-NEXT:  .LBB8_4: // %unwind_dtors1080; CHECK-NEXT:  .Ltmp26: // EH_LABEL1081; CHECK-NEXT:    mov x20, x01082; CHECK-NEXT:    smstart za1083; CHECK-NEXT:    mrs x8, TPIDR2_EL01084; CHECK-NEXT:    sub x0, x29, #801085; CHECK-NEXT:    cbnz x8, .LBB8_61086; CHECK-NEXT:  // %bb.5: // %unwind_dtors1087; CHECK-NEXT:    bl __arm_tpidr2_restore1088; CHECK-NEXT:  .LBB8_6: // %unwind_dtors1089; CHECK-NEXT:    msr TPIDR2_EL0, xzr1090; CHECK-NEXT:    blr x191091; CHECK-NEXT:    sub x8, x29, #801092; CHECK-NEXT:    mov x0, x201093; CHECK-NEXT:    msr TPIDR2_EL0, x81094; CHECK-NEXT:    bl _Unwind_Resume1095;1096; CHECK-SDAG-LABEL: try_catch_shared_za_callee_zt0_saved:1097; CHECK-SDAG:       .Lfunc_begin8:1098; CHECK-SDAG-NEXT:    .cfi_startproc1099; CHECK-SDAG-NEXT:    .cfi_personality 156, DW.ref.__gxx_personality_v01100; CHECK-SDAG-NEXT:    .cfi_lsda 28, .Lexception81101; CHECK-SDAG-NEXT:  // %bb.0:1102; CHECK-SDAG-NEXT:    stp x29, x30, [sp, #-48]! // 16-byte Folded Spill1103; CHECK-SDAG-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill1104; CHECK-SDAG-NEXT:    mov x29, sp1105; CHECK-SDAG-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill1106; CHECK-SDAG-NEXT:    sub sp, sp, #801107; CHECK-SDAG-NEXT:    .cfi_def_cfa w29, 481108; CHECK-SDAG-NEXT:    .cfi_offset w19, -81109; CHECK-SDAG-NEXT:    .cfi_offset w20, -161110; CHECK-SDAG-NEXT:    .cfi_offset w21, -241111; CHECK-SDAG-NEXT:    .cfi_offset w22, -321112; CHECK-SDAG-NEXT:    .cfi_offset w30, -401113; CHECK-SDAG-NEXT:    .cfi_offset w29, -481114; CHECK-SDAG-NEXT:    rdsvl x8, #11115; CHECK-SDAG-NEXT:    mov x9, sp1116; CHECK-SDAG-NEXT:    mov x19, x01117; CHECK-SDAG-NEXT:    msub x9, x8, x8, x91118; CHECK-SDAG-NEXT:    mov sp, x91119; CHECK-SDAG-NEXT:    stp x9, x8, [x29, #-16]1120; CHECK-SDAG-NEXT:  .Ltmp24: // EH_LABEL1121; CHECK-SDAG-NEXT:    sub x8, x29, #161122; CHECK-SDAG-NEXT:    sub x20, x29, #801123; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x81124; CHECK-SDAG-NEXT:    str zt0, [x20]1125; CHECK-SDAG-NEXT:    bl may_throw1126; CHECK-SDAG-NEXT:    smstart za1127; CHECK-SDAG-NEXT:    ldr zt0, [x20]1128; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL01129; CHECK-SDAG-NEXT:    sub x0, x29, #161130; CHECK-SDAG-NEXT:    cbnz x8, .LBB8_21131; CHECK-SDAG-NEXT:  // %bb.1:1132; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore1133; CHECK-SDAG-NEXT:  .LBB8_2:1134; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr1135; CHECK-SDAG-NEXT:  .Ltmp25: // EH_LABEL1136; CHECK-SDAG-NEXT:  // %bb.3: // %return_normally1137; CHECK-SDAG-NEXT:    mov sp, x291138; CHECK-SDAG-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload1139; CHECK-SDAG-NEXT:    ldp x22, x21, [sp, #16] // 16-byte Folded Reload1140; CHECK-SDAG-NEXT:    ldp x29, x30, [sp], #48 // 16-byte Folded Reload1141; CHECK-SDAG-NEXT:    ret1142; CHECK-SDAG-NEXT:  .LBB8_4: // %unwind_dtors1143; CHECK-SDAG-NEXT:  .Ltmp26: // EH_LABEL1144; CHECK-SDAG-NEXT:    sub x21, x29, #801145; CHECK-SDAG-NEXT:    sub x22, x29, #161146; CHECK-SDAG-NEXT:    mov x20, x01147; CHECK-SDAG-NEXT:    smstart za1148; CHECK-SDAG-NEXT:    ldr zt0, [x21]1149; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL01150; CHECK-SDAG-NEXT:    sub x0, x29, #161151; CHECK-SDAG-NEXT:    cbnz x8, .LBB8_61152; CHECK-SDAG-NEXT:  // %bb.5: // %unwind_dtors1153; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore1154; CHECK-SDAG-NEXT:  .LBB8_6: // %unwind_dtors1155; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr1156; CHECK-SDAG-NEXT:    str zt0, [x21]1157; CHECK-SDAG-NEXT:    blr x191158; CHECK-SDAG-NEXT:    ldr zt0, [x21]1159; CHECK-SDAG-NEXT:    mov x0, x201160; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, x221161; CHECK-SDAG-NEXT:    str zt0, [x21]1162; CHECK-SDAG-NEXT:    bl _Unwind_Resume1163; CHECK-SDAG-NEXT:    smstart za1164; CHECK-SDAG-NEXT:    ldr zt0, [x21]1165; CHECK-SDAG-NEXT:    mrs x8, TPIDR2_EL01166; CHECK-SDAG-NEXT:    sub x0, x29, #161167; CHECK-SDAG-NEXT:    cbnz x8, .LBB8_81168; CHECK-SDAG-NEXT:  // %bb.7: // %unwind_dtors1169; CHECK-SDAG-NEXT:    bl __arm_tpidr2_restore1170; CHECK-SDAG-NEXT:  .LBB8_8: // %unwind_dtors1171; CHECK-SDAG-NEXT:    msr TPIDR2_EL0, xzr1172  invoke void @may_throw()1173          to label %return_normally unwind label %unwind_dtors1174 1175unwind_dtors:1176  %5 = landingpad { ptr, i32 }1177          cleanup1178  call void %callee() "aarch64_inout_za"1179  resume { ptr, i32 } %51180 1181return_normally:1182  ret void1183}1184 1185declare ptr @__cxa_allocate_exception(i64)1186declare void @__cxa_throw(ptr, ptr, ptr)1187declare ptr @__cxa_begin_catch(ptr)1188declare void @__cxa_end_catch()1189declare i32 @__gxx_personality_v0(...)1190 1191declare void @may_throw()1192declare void @shared_za_call() "aarch64_inout_za"1193declare void @noexcept_shared_za_call() "aarch64_inout_za"1194declare void @shared_zt0_call() "aarch64_inout_zt0"1195declare void @agnostic_za_call() "aarch64_za_state_agnostic"1196