diff options
Diffstat (limited to 'llvm/test/CodeGen/AArch64/sme-za-exceptions.ll')
| -rw-r--r-- | llvm/test/CodeGen/AArch64/sme-za-exceptions.ll | 327 |
1 files changed, 268 insertions, 59 deletions
diff --git a/llvm/test/CodeGen/AArch64/sme-za-exceptions.ll b/llvm/test/CodeGen/AArch64/sme-za-exceptions.ll index 3f35cb5..3947127 100644 --- a/llvm/test/CodeGen/AArch64/sme-za-exceptions.ll +++ b/llvm/test/CodeGen/AArch64/sme-za-exceptions.ll @@ -31,7 +31,7 @@ define void @za_with_raii(i1 %fail) "aarch64_inout_za" personality ptr @__gxx_pe ; CHECK-NEXT: .cfi_lsda 28, .Lexception0 ; CHECK-NEXT: // %bb.0: ; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-NEXT: mov x29, sp ; CHECK-NEXT: sub sp, sp, #16 ; CHECK-NEXT: .cfi_def_cfa w29, 32 @@ -46,7 +46,7 @@ define void @za_with_raii(i1 %fail) "aarch64_inout_za" personality ptr @__gxx_pe ; CHECK-NEXT: tbnz w0, #0, .LBB0_2 ; CHECK-NEXT: // %bb.1: // %return_normally ; CHECK-NEXT: mov sp, x29 -; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-NEXT: b shared_za_call ; CHECK-NEXT: .LBB0_2: // %throw_exception @@ -63,25 +63,17 @@ define void @za_with_raii(i1 %fail) "aarch64_inout_za" personality ptr @__gxx_pe ; CHECK-NEXT: ldr x1, [x1, :got_lo12:typeinfo_for_char_const_ptr] ; CHECK-NEXT: bl __cxa_throw ; CHECK-NEXT: .Ltmp1: // EH_LABEL -; CHECK-NEXT: smstart za -; CHECK-NEXT: mrs x8, TPIDR2_EL0 -; CHECK-NEXT: sub x0, x29, #16 -; CHECK-NEXT: cbnz x8, .LBB0_4 -; CHECK-NEXT: // %bb.3: // %throw_exception -; CHECK-NEXT: bl __arm_tpidr2_restore -; CHECK-NEXT: .LBB0_4: // %throw_exception -; CHECK-NEXT: msr TPIDR2_EL0, xzr -; CHECK-NEXT: // %bb.5: // %throw_fail -; CHECK-NEXT: .LBB0_6: // %unwind_dtors +; CHECK-NEXT: // %bb.3: // %throw_fail +; CHECK-NEXT: .LBB0_4: // %unwind_dtors ; CHECK-NEXT: .Ltmp2: // EH_LABEL ; CHECK-NEXT: mov x19, x0 ; CHECK-NEXT: smstart za ; CHECK-NEXT: mrs x8, TPIDR2_EL0 ; CHECK-NEXT: sub x0, x29, #16 -; CHECK-NEXT: cbnz x8, .LBB0_8 -; CHECK-NEXT: // %bb.7: // %unwind_dtors +; CHECK-NEXT: cbnz x8, .LBB0_6 +; CHECK-NEXT: // %bb.5: // %unwind_dtors ; CHECK-NEXT: bl __arm_tpidr2_restore -; CHECK-NEXT: .LBB0_8: // %unwind_dtors +; CHECK-NEXT: .LBB0_6: // %unwind_dtors ; CHECK-NEXT: msr TPIDR2_EL0, xzr ; CHECK-NEXT: bl shared_za_call ; CHECK-NEXT: sub x8, x29, #16 @@ -268,7 +260,7 @@ define void @try_catch() "aarch64_inout_za" personality ptr @__gxx_personality_v ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception1 ; CHECK-SDAG-NEXT: // %bb.0: ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-SDAG-NEXT: mov x29, sp ; CHECK-SDAG-NEXT: sub sp, sp, #16 ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 32 @@ -295,7 +287,7 @@ define void @try_catch() "aarch64_inout_za" personality ptr @__gxx_personality_v ; CHECK-SDAG-NEXT: .Ltmp4: // EH_LABEL ; CHECK-SDAG-NEXT: .LBB1_3: // %after_catch ; CHECK-SDAG-NEXT: mov sp, x29 -; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-SDAG-NEXT: b shared_za_call ; CHECK-SDAG-NEXT: .LBB1_4: // %catch @@ -425,7 +417,7 @@ define void @try_catch_shared_za_callee() "aarch64_new_za" personality ptr @__gx ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception2 ; CHECK-SDAG-NEXT: // %bb.0: // %prelude ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-SDAG-NEXT: mov x29, sp ; CHECK-SDAG-NEXT: sub sp, sp, #16 ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 32 @@ -451,7 +443,7 @@ define void @try_catch_shared_za_callee() "aarch64_new_za" personality ptr @__gx ; CHECK-SDAG-NEXT: .LBB2_3: // %exit ; CHECK-SDAG-NEXT: smstop za ; CHECK-SDAG-NEXT: mov sp, x29 -; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-SDAG-NEXT: ret ; CHECK-SDAG-NEXT: .LBB2_4: // %catch @@ -519,7 +511,6 @@ exit: ; ; This code may require reloading ZT0 in the cleanup for ~ZT0Resource(). ; -; FIXME: Codegen with `-aarch64-new-sme-abi` is broken with ZT0 (as it is not implemented). define void @try_catch_shared_zt0_callee() "aarch64_inout_zt0" personality ptr @__gxx_personality_v0 { ; CHECK-LABEL: try_catch_shared_zt0_callee: ; CHECK: .Lfunc_begin3: @@ -527,52 +518,37 @@ define void @try_catch_shared_zt0_callee() "aarch64_inout_zt0" personality ptr @ ; CHECK-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0 ; CHECK-NEXT: .cfi_lsda 28, .Lexception3 ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill -; CHECK-NEXT: mov x29, sp -; CHECK-NEXT: sub sp, sp, #80 -; CHECK-NEXT: .cfi_def_cfa w29, 32 +; CHECK-NEXT: sub sp, sp, #96 +; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill +; CHECK-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill +; CHECK-NEXT: .cfi_def_cfa_offset 96 ; CHECK-NEXT: .cfi_offset w19, -8 ; CHECK-NEXT: .cfi_offset w20, -16 -; CHECK-NEXT: .cfi_offset w30, -24 -; CHECK-NEXT: .cfi_offset w29, -32 -; CHECK-NEXT: rdsvl x8, #1 -; CHECK-NEXT: mov x9, sp -; CHECK-NEXT: msub x9, x8, x8, x9 -; CHECK-NEXT: mov sp, x9 -; CHECK-NEXT: stp x9, x8, [x29, #-80] +; CHECK-NEXT: .cfi_offset w30, -32 ; CHECK-NEXT: .Ltmp9: // EH_LABEL -; CHECK-NEXT: sub x19, x29, #64 +; CHECK-NEXT: mov x19, sp ; CHECK-NEXT: str zt0, [x19] ; CHECK-NEXT: smstop za ; CHECK-NEXT: bl may_throw +; CHECK-NEXT: .Ltmp10: // EH_LABEL ; CHECK-NEXT: smstart za ; CHECK-NEXT: ldr zt0, [x19] -; CHECK-NEXT: .Ltmp10: // EH_LABEL ; CHECK-NEXT: // %bb.1: // %return_normally -; CHECK-NEXT: mov sp, x29 -; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload -; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload +; CHECK-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload +; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload +; CHECK-NEXT: add sp, sp, #96 ; CHECK-NEXT: ret ; CHECK-NEXT: .LBB3_2: // %unwind_dtors ; CHECK-NEXT: .Ltmp11: // EH_LABEL -; CHECK-NEXT: sub x20, x29, #64 +; CHECK-NEXT: mov x20, sp ; CHECK-NEXT: mov x19, x0 ; CHECK-NEXT: smstart za -; CHECK-NEXT: mrs x8, TPIDR2_EL0 -; CHECK-NEXT: sub x0, x29, #80 -; CHECK-NEXT: cbnz x8, .LBB3_4 -; CHECK-NEXT: // %bb.3: // %unwind_dtors -; CHECK-NEXT: bl __arm_tpidr2_restore -; CHECK-NEXT: .LBB3_4: // %unwind_dtors -; CHECK-NEXT: msr TPIDR2_EL0, xzr +; CHECK-NEXT: ldr zt0, [x20] ; CHECK-NEXT: bl shared_zt0_call ; CHECK-NEXT: str zt0, [x20] ; CHECK-NEXT: smstop za ; CHECK-NEXT: mov x0, x19 ; CHECK-NEXT: bl _Unwind_Resume -; CHECK-NEXT: smstart za -; CHECK-NEXT: ldr zt0, [x20] ; ; CHECK-SDAG-LABEL: try_catch_shared_zt0_callee: ; CHECK-SDAG: .Lfunc_begin3: @@ -581,7 +557,7 @@ define void @try_catch_shared_zt0_callee() "aarch64_inout_zt0" personality ptr @ ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception3 ; CHECK-SDAG-NEXT: // %bb.0: ; CHECK-SDAG-NEXT: sub sp, sp, #96 -; CHECK-SDAG-NEXT: str x30, [sp, #64] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x30, [sp, #64] // 8-byte Spill ; CHECK-SDAG-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 96 ; CHECK-SDAG-NEXT: .cfi_offset w19, -8 @@ -597,7 +573,7 @@ define void @try_catch_shared_zt0_callee() "aarch64_inout_zt0" personality ptr @ ; CHECK-SDAG-NEXT: .Ltmp10: // EH_LABEL ; CHECK-SDAG-NEXT: // %bb.1: // %return_normally ; CHECK-SDAG-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload -; CHECK-SDAG-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x30, [sp, #64] // 8-byte Reload ; CHECK-SDAG-NEXT: add sp, sp, #96 ; CHECK-SDAG-NEXT: ret ; CHECK-SDAG-NEXT: .LBB3_2: // %unwind_dtors @@ -646,7 +622,7 @@ define void @try_catch_agnostic_za() "aarch64_za_state_agnostic" personality ptr ; CHECK-NEXT: .cfi_lsda 28, .Lexception4 ; CHECK-NEXT: // %bb.0: ; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-NEXT: mov x29, sp ; CHECK-NEXT: .cfi_def_cfa w29, 32 ; CHECK-NEXT: .cfi_offset w19, -16 @@ -664,7 +640,7 @@ define void @try_catch_agnostic_za() "aarch64_za_state_agnostic" personality ptr ; CHECK-NEXT: mov x0, x19 ; CHECK-NEXT: bl __arm_sme_restore ; CHECK-NEXT: mov sp, x29 -; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-NEXT: ret ; CHECK-NEXT: .LBB4_2: // %catch @@ -680,7 +656,7 @@ define void @try_catch_agnostic_za() "aarch64_za_state_agnostic" personality ptr ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception4 ; CHECK-SDAG-NEXT: // %bb.0: ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-SDAG-NEXT: mov x29, sp ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 32 ; CHECK-SDAG-NEXT: .cfi_offset w19, -16 @@ -698,7 +674,7 @@ define void @try_catch_agnostic_za() "aarch64_za_state_agnostic" personality ptr ; CHECK-SDAG-NEXT: .Ltmp13: // EH_LABEL ; CHECK-SDAG-NEXT: .LBB4_1: // %exit ; CHECK-SDAG-NEXT: mov sp, x29 -; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-SDAG-NEXT: ret ; CHECK-SDAG-NEXT: .LBB4_2: // %catch @@ -756,7 +732,7 @@ define void @try_catch_agnostic_za_invoke() "aarch64_za_state_agnostic" personal ; CHECK-NEXT: .cfi_lsda 28, .Lexception5 ; CHECK-NEXT: // %bb.0: // %entry ; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-NEXT: mov x29, sp ; CHECK-NEXT: .cfi_def_cfa w29, 32 ; CHECK-NEXT: .cfi_offset w19, -16 @@ -774,7 +750,7 @@ define void @try_catch_agnostic_za_invoke() "aarch64_za_state_agnostic" personal ; CHECK-NEXT: mov x0, x19 ; CHECK-NEXT: bl __arm_sme_restore ; CHECK-NEXT: mov sp, x29 -; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-NEXT: ret ; CHECK-NEXT: .LBB5_2: // %catch @@ -790,7 +766,7 @@ define void @try_catch_agnostic_za_invoke() "aarch64_za_state_agnostic" personal ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception5 ; CHECK-SDAG-NEXT: // %bb.0: // %entry ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-SDAG-NEXT: mov x29, sp ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 32 ; CHECK-SDAG-NEXT: .cfi_offset w19, -16 @@ -808,7 +784,7 @@ define void @try_catch_agnostic_za_invoke() "aarch64_za_state_agnostic" personal ; CHECK-SDAG-NEXT: .Ltmp16: // EH_LABEL ; CHECK-SDAG-NEXT: .LBB5_1: // %exit ; CHECK-SDAG-NEXT: mov sp, x29 -; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-SDAG-NEXT: ret ; CHECK-SDAG-NEXT: .LBB5_2: // %catch @@ -894,7 +870,7 @@ define void @try_catch_inout_za_agnostic_za_callee() "aarch64_inout_za" personal ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception6 ; CHECK-SDAG-NEXT: // %bb.0: // %entry ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill -; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-SDAG-NEXT: str x19, [sp, #16] // 8-byte Spill ; CHECK-SDAG-NEXT: mov x29, sp ; CHECK-SDAG-NEXT: sub sp, sp, #16 ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 32 @@ -921,7 +897,7 @@ define void @try_catch_inout_za_agnostic_za_callee() "aarch64_inout_za" personal ; CHECK-SDAG-NEXT: .Ltmp19: // EH_LABEL ; CHECK-SDAG-NEXT: .LBB6_3: // %exit ; CHECK-SDAG-NEXT: mov sp, x29 -; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-SDAG-NEXT: ldr x19, [sp, #16] // 8-byte Reload ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload ; CHECK-SDAG-NEXT: ret ; CHECK-SDAG-NEXT: .LBB6_4: // %catch @@ -973,6 +949,239 @@ exit: ret void } +define void @try_catch_inout_zt0() "aarch64_inout_zt0" personality ptr @__gxx_personality_v0 { +; CHECK-LABEL: try_catch_inout_zt0: +; CHECK: .Lfunc_begin7: +; CHECK-NEXT: .cfi_startproc +; CHECK-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0 +; CHECK-NEXT: .cfi_lsda 28, .Lexception7 +; CHECK-NEXT: // %bb.0: // %entry +; CHECK-NEXT: sub sp, sp, #80 +; CHECK-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill +; CHECK-NEXT: .cfi_def_cfa_offset 80 +; CHECK-NEXT: .cfi_offset w19, -8 +; CHECK-NEXT: .cfi_offset w30, -16 +; CHECK-NEXT: .Ltmp21: // EH_LABEL +; CHECK-NEXT: mov x19, sp +; CHECK-NEXT: str zt0, [x19] +; CHECK-NEXT: smstop za +; CHECK-NEXT: bl may_throw +; CHECK-NEXT: .Ltmp22: // EH_LABEL +; CHECK-NEXT: .LBB7_1: // %exit +; CHECK-NEXT: smstart za +; CHECK-NEXT: ldr zt0, [x19] +; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload +; CHECK-NEXT: add sp, sp, #80 +; CHECK-NEXT: ret +; CHECK-NEXT: .LBB7_2: // %catch +; CHECK-NEXT: .Ltmp23: // EH_LABEL +; CHECK-NEXT: bl __cxa_begin_catch +; CHECK-NEXT: bl __cxa_end_catch +; CHECK-NEXT: b .LBB7_1 +; +; CHECK-SDAG-LABEL: try_catch_inout_zt0: +; CHECK-SDAG: .Lfunc_begin7: +; CHECK-SDAG-NEXT: .cfi_startproc +; CHECK-SDAG-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0 +; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception7 +; CHECK-SDAG-NEXT: // %bb.0: // %entry +; CHECK-SDAG-NEXT: sub sp, sp, #80 +; CHECK-SDAG-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill +; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 80 +; CHECK-SDAG-NEXT: .cfi_offset w19, -8 +; CHECK-SDAG-NEXT: .cfi_offset w30, -16 +; CHECK-SDAG-NEXT: .Ltmp21: // EH_LABEL +; CHECK-SDAG-NEXT: mov x19, sp +; CHECK-SDAG-NEXT: str zt0, [x19] +; CHECK-SDAG-NEXT: smstop za +; CHECK-SDAG-NEXT: bl may_throw +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x19] +; CHECK-SDAG-NEXT: .Ltmp22: // EH_LABEL +; CHECK-SDAG-NEXT: .LBB7_1: // %exit +; CHECK-SDAG-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload +; CHECK-SDAG-NEXT: add sp, sp, #80 +; CHECK-SDAG-NEXT: ret +; CHECK-SDAG-NEXT: .LBB7_2: // %catch +; CHECK-SDAG-NEXT: .Ltmp23: // EH_LABEL +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x19] +; CHECK-SDAG-NEXT: str zt0, [x19] +; CHECK-SDAG-NEXT: smstop za +; CHECK-SDAG-NEXT: bl __cxa_begin_catch +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x19] +; CHECK-SDAG-NEXT: str zt0, [x19] +; CHECK-SDAG-NEXT: smstop za +; CHECK-SDAG-NEXT: bl __cxa_end_catch +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x19] +; CHECK-SDAG-NEXT: b .LBB7_1 +entry: + invoke void @may_throw() + to label %exit unwind label %catch + +catch: + %eh_info = landingpad { ptr, i32 } + catch ptr null + %exception_ptr = extractvalue { ptr, i32 } %eh_info, 0 + tail call ptr @__cxa_begin_catch(ptr %exception_ptr) + tail call void @__cxa_end_catch() + br label %exit + +exit: + ret void +} + +define void @try_catch_shared_za_callee_zt0_saved(ptr %callee) "aarch64_inout_za" "aarch64_in_zt0" personality ptr @__gxx_personality_v0 { +; CHECK-LABEL: try_catch_shared_za_callee_zt0_saved: +; CHECK: .Lfunc_begin8: +; CHECK-NEXT: .cfi_startproc +; CHECK-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0 +; CHECK-NEXT: .cfi_lsda 28, .Lexception8 +; CHECK-NEXT: // %bb.0: +; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill +; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill +; CHECK-NEXT: mov x29, sp +; CHECK-NEXT: sub sp, sp, #80 +; CHECK-NEXT: .cfi_def_cfa w29, 32 +; CHECK-NEXT: .cfi_offset w19, -8 +; CHECK-NEXT: .cfi_offset w20, -16 +; CHECK-NEXT: .cfi_offset w30, -24 +; CHECK-NEXT: .cfi_offset w29, -32 +; CHECK-NEXT: rdsvl x8, #1 +; CHECK-NEXT: mov x9, sp +; CHECK-NEXT: msub x9, x8, x8, x9 +; CHECK-NEXT: mov sp, x9 +; CHECK-NEXT: mov x19, x0 +; CHECK-NEXT: stp x9, x8, [x29, #-80] +; CHECK-NEXT: .Ltmp24: // EH_LABEL +; CHECK-NEXT: sub x20, x29, #64 +; CHECK-NEXT: sub x8, x29, #80 +; CHECK-NEXT: str zt0, [x20] +; CHECK-NEXT: msr TPIDR2_EL0, x8 +; CHECK-NEXT: bl may_throw +; CHECK-NEXT: .Ltmp25: // EH_LABEL +; CHECK-NEXT: smstart za +; CHECK-NEXT: mrs x8, TPIDR2_EL0 +; CHECK-NEXT: sub x0, x29, #80 +; CHECK-NEXT: cbnz x8, .LBB8_2 +; CHECK-NEXT: // %bb.1: +; CHECK-NEXT: bl __arm_tpidr2_restore +; CHECK-NEXT: .LBB8_2: +; CHECK-NEXT: msr TPIDR2_EL0, xzr +; CHECK-NEXT: ldr zt0, [x20] +; CHECK-NEXT: // %bb.3: // %return_normally +; CHECK-NEXT: mov sp, x29 +; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload +; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload +; CHECK-NEXT: ret +; CHECK-NEXT: .LBB8_4: // %unwind_dtors +; CHECK-NEXT: .Ltmp26: // EH_LABEL +; CHECK-NEXT: mov x20, x0 +; CHECK-NEXT: smstart za +; CHECK-NEXT: mrs x8, TPIDR2_EL0 +; CHECK-NEXT: sub x0, x29, #80 +; CHECK-NEXT: cbnz x8, .LBB8_6 +; CHECK-NEXT: // %bb.5: // %unwind_dtors +; CHECK-NEXT: bl __arm_tpidr2_restore +; CHECK-NEXT: .LBB8_6: // %unwind_dtors +; CHECK-NEXT: msr TPIDR2_EL0, xzr +; CHECK-NEXT: blr x19 +; CHECK-NEXT: sub x8, x29, #80 +; CHECK-NEXT: mov x0, x20 +; CHECK-NEXT: msr TPIDR2_EL0, x8 +; CHECK-NEXT: bl _Unwind_Resume +; +; CHECK-SDAG-LABEL: try_catch_shared_za_callee_zt0_saved: +; CHECK-SDAG: .Lfunc_begin8: +; CHECK-SDAG-NEXT: .cfi_startproc +; CHECK-SDAG-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0 +; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception8 +; CHECK-SDAG-NEXT: // %bb.0: +; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-48]! // 16-byte Folded Spill +; CHECK-SDAG-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill +; CHECK-SDAG-NEXT: mov x29, sp +; CHECK-SDAG-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill +; CHECK-SDAG-NEXT: sub sp, sp, #80 +; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 48 +; CHECK-SDAG-NEXT: .cfi_offset w19, -8 +; CHECK-SDAG-NEXT: .cfi_offset w20, -16 +; CHECK-SDAG-NEXT: .cfi_offset w21, -24 +; CHECK-SDAG-NEXT: .cfi_offset w22, -32 +; CHECK-SDAG-NEXT: .cfi_offset w30, -40 +; CHECK-SDAG-NEXT: .cfi_offset w29, -48 +; CHECK-SDAG-NEXT: rdsvl x8, #1 +; CHECK-SDAG-NEXT: mov x9, sp +; CHECK-SDAG-NEXT: mov x19, x0 +; CHECK-SDAG-NEXT: msub x9, x8, x8, x9 +; CHECK-SDAG-NEXT: mov sp, x9 +; CHECK-SDAG-NEXT: stp x9, x8, [x29, #-16] +; CHECK-SDAG-NEXT: .Ltmp24: // EH_LABEL +; CHECK-SDAG-NEXT: sub x8, x29, #16 +; CHECK-SDAG-NEXT: sub x20, x29, #80 +; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x8 +; CHECK-SDAG-NEXT: str zt0, [x20] +; CHECK-SDAG-NEXT: bl may_throw +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x20] +; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0 +; CHECK-SDAG-NEXT: sub x0, x29, #16 +; CHECK-SDAG-NEXT: cbnz x8, .LBB8_2 +; CHECK-SDAG-NEXT: // %bb.1: +; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore +; CHECK-SDAG-NEXT: .LBB8_2: +; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr +; CHECK-SDAG-NEXT: .Ltmp25: // EH_LABEL +; CHECK-SDAG-NEXT: // %bb.3: // %return_normally +; CHECK-SDAG-NEXT: mov sp, x29 +; CHECK-SDAG-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload +; CHECK-SDAG-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload +; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #48 // 16-byte Folded Reload +; CHECK-SDAG-NEXT: ret +; CHECK-SDAG-NEXT: .LBB8_4: // %unwind_dtors +; CHECK-SDAG-NEXT: .Ltmp26: // EH_LABEL +; CHECK-SDAG-NEXT: sub x21, x29, #80 +; CHECK-SDAG-NEXT: sub x22, x29, #16 +; CHECK-SDAG-NEXT: mov x20, x0 +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x21] +; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0 +; CHECK-SDAG-NEXT: sub x0, x29, #16 +; CHECK-SDAG-NEXT: cbnz x8, .LBB8_6 +; CHECK-SDAG-NEXT: // %bb.5: // %unwind_dtors +; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore +; CHECK-SDAG-NEXT: .LBB8_6: // %unwind_dtors +; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr +; CHECK-SDAG-NEXT: str zt0, [x21] +; CHECK-SDAG-NEXT: blr x19 +; CHECK-SDAG-NEXT: ldr zt0, [x21] +; CHECK-SDAG-NEXT: mov x0, x20 +; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x22 +; CHECK-SDAG-NEXT: str zt0, [x21] +; CHECK-SDAG-NEXT: bl _Unwind_Resume +; CHECK-SDAG-NEXT: smstart za +; CHECK-SDAG-NEXT: ldr zt0, [x21] +; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0 +; CHECK-SDAG-NEXT: sub x0, x29, #16 +; CHECK-SDAG-NEXT: cbnz x8, .LBB8_8 +; CHECK-SDAG-NEXT: // %bb.7: // %unwind_dtors +; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore +; CHECK-SDAG-NEXT: .LBB8_8: // %unwind_dtors +; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr + invoke void @may_throw() + to label %return_normally unwind label %unwind_dtors + +unwind_dtors: + %5 = landingpad { ptr, i32 } + cleanup + call void %callee() "aarch64_inout_za" + resume { ptr, i32 } %5 + +return_normally: + ret void +} + declare ptr @__cxa_allocate_exception(i64) declare void @__cxa_throw(ptr, ptr, ptr) declare ptr @__cxa_begin_catch(ptr) |
