Skip to content

Commit 34d3591

Browse files
committed
Add extra test (and missing transition)
Change-Id: If4df9272e1951487a0491b734293f3265024c6a9
1 parent 4751a17 commit 34d3591

File tree

2 files changed

+152
-2
lines changed

2 files changed

+152
-2
lines changed

llvm/lib/Target/AArch64/MachineSMEABIPass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,9 +1065,10 @@ void MachineSMEABI::emitStateChange(EmitContext &Context,
10651065
emitZT0SaveRestore(Context, MBB, InsertPt, /*IsSave=*/false);
10661066
break;
10671067

1068-
// This section handles: ACTIVE -> LOCAL_SAVED
1068+
// This section handles: ACTIVE[_ZT0_SAVED] -> LOCAL_SAVED
10691069
case transitionFrom(ZAState::ACTIVE).to(ZAState::LOCAL_SAVED):
1070-
if (HasZT0State)
1070+
case transitionFrom(ZAState::ACTIVE_ZT0_SAVED).to(ZAState::LOCAL_SAVED):
1071+
if (HasZT0State && From == ZAState::ACTIVE)
10711072
emitZT0SaveRestore(Context, MBB, InsertPt, /*IsSave=*/true);
10721073
if (HasZAState)
10731074
emitZASave(Context, MBB, InsertPt, PhysLiveRegs);

llvm/test/CodeGen/AArch64/sme-za-exceptions.ll

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,155 @@ exit:
10331033
ret void
10341034
}
10351035

1036+
define 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_startproc
1040+
; CHECK-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
1041+
; CHECK-NEXT: .cfi_lsda 28, .Lexception8
1042+
; CHECK-NEXT: // %bb.0:
1043+
; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill
1044+
; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
1045+
; CHECK-NEXT: mov x29, sp
1046+
; CHECK-NEXT: sub sp, sp, #80
1047+
; CHECK-NEXT: .cfi_def_cfa w29, 32
1048+
; CHECK-NEXT: .cfi_offset w19, -8
1049+
; CHECK-NEXT: .cfi_offset w20, -16
1050+
; CHECK-NEXT: .cfi_offset w30, -24
1051+
; CHECK-NEXT: .cfi_offset w29, -32
1052+
; CHECK-NEXT: rdsvl x8, #1
1053+
; CHECK-NEXT: mov x9, sp
1054+
; CHECK-NEXT: msub x9, x8, x8, x9
1055+
; CHECK-NEXT: mov sp, x9
1056+
; CHECK-NEXT: mov x19, x0
1057+
; CHECK-NEXT: stp x9, x8, [x29, #-80]
1058+
; CHECK-NEXT: .Ltmp24: // EH_LABEL
1059+
; CHECK-NEXT: sub x20, x29, #64
1060+
; CHECK-NEXT: sub x8, x29, #80
1061+
; CHECK-NEXT: str zt0, [x20]
1062+
; CHECK-NEXT: msr TPIDR2_EL0, x8
1063+
; CHECK-NEXT: bl may_throw
1064+
; CHECK-NEXT: .Ltmp25: // EH_LABEL
1065+
; CHECK-NEXT: smstart za
1066+
; CHECK-NEXT: mrs x8, TPIDR2_EL0
1067+
; CHECK-NEXT: sub x0, x29, #80
1068+
; CHECK-NEXT: cbnz x8, .LBB8_2
1069+
; CHECK-NEXT: // %bb.1:
1070+
; CHECK-NEXT: bl __arm_tpidr2_restore
1071+
; CHECK-NEXT: .LBB8_2:
1072+
; CHECK-NEXT: msr TPIDR2_EL0, xzr
1073+
; CHECK-NEXT: ldr zt0, [x20]
1074+
; CHECK-NEXT: // %bb.3: // %return_normally
1075+
; CHECK-NEXT: mov sp, x29
1076+
; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
1077+
; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload
1078+
; CHECK-NEXT: ret
1079+
; CHECK-NEXT: .LBB8_4: // %unwind_dtors
1080+
; CHECK-NEXT: .Ltmp26: // EH_LABEL
1081+
; CHECK-NEXT: mov x20, x0
1082+
; CHECK-NEXT: smstart za
1083+
; CHECK-NEXT: mrs x8, TPIDR2_EL0
1084+
; CHECK-NEXT: sub x0, x29, #80
1085+
; CHECK-NEXT: cbnz x8, .LBB8_6
1086+
; CHECK-NEXT: // %bb.5: // %unwind_dtors
1087+
; CHECK-NEXT: bl __arm_tpidr2_restore
1088+
; CHECK-NEXT: .LBB8_6: // %unwind_dtors
1089+
; CHECK-NEXT: msr TPIDR2_EL0, xzr
1090+
; CHECK-NEXT: blr x19
1091+
; CHECK-NEXT: sub x8, x29, #80
1092+
; CHECK-NEXT: mov x0, x20
1093+
; CHECK-NEXT: msr TPIDR2_EL0, x8
1094+
; CHECK-NEXT: bl _Unwind_Resume
1095+
;
1096+
; CHECK-SDAG-LABEL: try_catch_shared_za_callee_zt0_saved:
1097+
; CHECK-SDAG: .Lfunc_begin8:
1098+
; CHECK-SDAG-NEXT: .cfi_startproc
1099+
; CHECK-SDAG-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
1100+
; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception8
1101+
; CHECK-SDAG-NEXT: // %bb.0:
1102+
; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-48]! // 16-byte Folded Spill
1103+
; CHECK-SDAG-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill
1104+
; CHECK-SDAG-NEXT: mov x29, sp
1105+
; CHECK-SDAG-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
1106+
; CHECK-SDAG-NEXT: sub sp, sp, #80
1107+
; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 48
1108+
; CHECK-SDAG-NEXT: .cfi_offset w19, -8
1109+
; CHECK-SDAG-NEXT: .cfi_offset w20, -16
1110+
; CHECK-SDAG-NEXT: .cfi_offset w21, -24
1111+
; CHECK-SDAG-NEXT: .cfi_offset w22, -32
1112+
; CHECK-SDAG-NEXT: .cfi_offset w30, -40
1113+
; CHECK-SDAG-NEXT: .cfi_offset w29, -48
1114+
; CHECK-SDAG-NEXT: rdsvl x8, #1
1115+
; CHECK-SDAG-NEXT: mov x9, sp
1116+
; CHECK-SDAG-NEXT: mov x19, x0
1117+
; CHECK-SDAG-NEXT: msub x9, x8, x8, x9
1118+
; CHECK-SDAG-NEXT: mov sp, x9
1119+
; CHECK-SDAG-NEXT: stp x9, x8, [x29, #-16]
1120+
; CHECK-SDAG-NEXT: .Ltmp24: // EH_LABEL
1121+
; CHECK-SDAG-NEXT: sub x8, x29, #16
1122+
; CHECK-SDAG-NEXT: sub x20, x29, #80
1123+
; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x8
1124+
; CHECK-SDAG-NEXT: str zt0, [x20]
1125+
; CHECK-SDAG-NEXT: bl may_throw
1126+
; CHECK-SDAG-NEXT: smstart za
1127+
; CHECK-SDAG-NEXT: ldr zt0, [x20]
1128+
; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1129+
; CHECK-SDAG-NEXT: sub x0, x29, #16
1130+
; CHECK-SDAG-NEXT: cbnz x8, .LBB8_2
1131+
; CHECK-SDAG-NEXT: // %bb.1:
1132+
; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1133+
; CHECK-SDAG-NEXT: .LBB8_2:
1134+
; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1135+
; CHECK-SDAG-NEXT: .Ltmp25: // EH_LABEL
1136+
; CHECK-SDAG-NEXT: // %bb.3: // %return_normally
1137+
; CHECK-SDAG-NEXT: mov sp, x29
1138+
; CHECK-SDAG-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1139+
; CHECK-SDAG-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload
1140+
; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #48 // 16-byte Folded Reload
1141+
; CHECK-SDAG-NEXT: ret
1142+
; CHECK-SDAG-NEXT: .LBB8_4: // %unwind_dtors
1143+
; CHECK-SDAG-NEXT: .Ltmp26: // EH_LABEL
1144+
; CHECK-SDAG-NEXT: sub x21, x29, #80
1145+
; CHECK-SDAG-NEXT: sub x22, x29, #16
1146+
; CHECK-SDAG-NEXT: mov x20, x0
1147+
; CHECK-SDAG-NEXT: smstart za
1148+
; CHECK-SDAG-NEXT: ldr zt0, [x21]
1149+
; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1150+
; CHECK-SDAG-NEXT: sub x0, x29, #16
1151+
; CHECK-SDAG-NEXT: cbnz x8, .LBB8_6
1152+
; CHECK-SDAG-NEXT: // %bb.5: // %unwind_dtors
1153+
; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1154+
; CHECK-SDAG-NEXT: .LBB8_6: // %unwind_dtors
1155+
; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1156+
; CHECK-SDAG-NEXT: str zt0, [x21]
1157+
; CHECK-SDAG-NEXT: blr x19
1158+
; CHECK-SDAG-NEXT: ldr zt0, [x21]
1159+
; CHECK-SDAG-NEXT: mov x0, x20
1160+
; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x22
1161+
; CHECK-SDAG-NEXT: str zt0, [x21]
1162+
; CHECK-SDAG-NEXT: bl _Unwind_Resume
1163+
; CHECK-SDAG-NEXT: smstart za
1164+
; CHECK-SDAG-NEXT: ldr zt0, [x21]
1165+
; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1166+
; CHECK-SDAG-NEXT: sub x0, x29, #16
1167+
; CHECK-SDAG-NEXT: cbnz x8, .LBB8_8
1168+
; CHECK-SDAG-NEXT: // %bb.7: // %unwind_dtors
1169+
; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1170+
; CHECK-SDAG-NEXT: .LBB8_8: // %unwind_dtors
1171+
; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1172+
invoke void @may_throw()
1173+
to label %return_normally unwind label %unwind_dtors
1174+
1175+
unwind_dtors:
1176+
%5 = landingpad { ptr, i32 }
1177+
cleanup
1178+
call void %callee() "aarch64_inout_za"
1179+
resume { ptr, i32 } %5
1180+
1181+
return_normally:
1182+
ret void
1183+
}
1184+
10361185
declare ptr @__cxa_allocate_exception(i64)
10371186
declare void @__cxa_throw(ptr, ptr, ptr)
10381187
declare ptr @__cxa_begin_catch(ptr)

0 commit comments

Comments
 (0)