diff --git a/llvm/test/CodeGen/AArch64/wineh-pac.ll b/llvm/test/CodeGen/AArch64/wineh-pac.ll index 797dd10d7e49d..4a95b159ff859 100644 --- a/llvm/test/CodeGen/AArch64/wineh-pac.ll +++ b/llvm/test/CodeGen/AArch64/wineh-pac.ll @@ -1,63 +1,65 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s define dso_local i32 @func(ptr %g, i32 %a) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" { +; CHECK-LABEL: func: +; CHECK: .seh_proc func +; CHECK-NEXT: // %bb.0: // %entry +; CHECK-NEXT: hint #27 +; CHECK-NEXT: .seh_pac_sign_lr +; CHECK-NEXT: str x19, [sp, #-16]! // 8-byte Folded Spill +; CHECK-NEXT: .seh_save_reg_x x19, 16 +; CHECK-NEXT: str x30, [sp, #8] // 8-byte Spill +; CHECK-NEXT: .seh_save_reg x30, 8 +; CHECK-NEXT: .seh_endprologue +; CHECK-NEXT: mov w19, w1 +; CHECK-NEXT: blr x0 +; CHECK-NEXT: mov w0, w19 +; CHECK-NEXT: .seh_startepilogue +; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Reload +; CHECK-NEXT: .seh_save_reg x30, 8 +; CHECK-NEXT: ldr x19, [sp], #16 // 8-byte Folded Reload +; CHECK-NEXT: .seh_save_reg_x x19, 16 +; CHECK-NEXT: hint #31 +; CHECK-NEXT: .seh_pac_sign_lr +; CHECK-NEXT: .seh_endepilogue +; CHECK-NEXT: ret +; CHECK-NEXT: .seh_endfunclet +; CHECK-NEXT: .seh_endproc entry: tail call void %g() #2 ret i32 %a } +;; For func2, check that the potentially folded autibsp+ret -> retab +;; is handled correctly - currently we inhibit producing retab here. + define dso_local i32 @func2(ptr %g, i32 %a) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" "target-features"="+v8.3a" { +; CHECK-LABEL: func2: +; CHECK: .seh_proc func2 +; CHECK-NEXT: // %bb.0: // %entry +; CHECK-NEXT: pacibsp +; CHECK-NEXT: .seh_pac_sign_lr +; CHECK-NEXT: str x19, [sp, #-16]! // 8-byte Folded Spill +; CHECK-NEXT: .seh_save_reg_x x19, 16 +; CHECK-NEXT: str x30, [sp, #8] // 8-byte Spill +; CHECK-NEXT: .seh_save_reg x30, 8 +; CHECK-NEXT: .seh_endprologue +; CHECK-NEXT: mov w19, w1 +; CHECK-NEXT: blr x0 +; CHECK-NEXT: mov w0, w19 +; CHECK-NEXT: .seh_startepilogue +; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Reload +; CHECK-NEXT: .seh_save_reg x30, 8 +; CHECK-NEXT: ldr x19, [sp], #16 // 8-byte Folded Reload +; CHECK-NEXT: .seh_save_reg_x x19, 16 +; CHECK-NEXT: autibsp +; CHECK-NEXT: .seh_pac_sign_lr +; CHECK-NEXT: .seh_endepilogue +; CHECK-NEXT: ret +; CHECK-NEXT: .seh_endfunclet +; CHECK-NEXT: .seh_endproc entry: tail call void %g() #2 ret i32 %a } - - -; CHECK-LABEL: func: -; CHECK-NEXT: .seh_proc func -; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: hint #27 -; CHECK-NEXT: .seh_pac_sign_lr -; CHECK-NEXT: str x19, [sp, #-16]! -; CHECK-NEXT: .seh_save_reg_x x19, 16 -; CHECK-NEXT: str x30, [sp, #8] -; CHECK-NEXT: .seh_save_reg x30, 8 -; CHECK-NEXT: .seh_endprologue - -; CHECK: .seh_startepilogue -; CHECK-NEXT: ldr x30, [sp, #8] -; CHECK-NEXT: .seh_save_reg x30, 8 -; CHECK-NEXT: ldr x19, [sp], #16 -; CHECK-NEXT: .seh_save_reg_x x19, 16 -; CHECK-NEXT: hint #31 -; CHECK-NEXT: .seh_pac_sign_lr -; CHECK-NEXT: .seh_endepilogue -; CHECK-NEXT: ret -; CHECK-NEXT: .seh_endfunclet -; CHECK-NEXT: .seh_endproc - -;; For func2, check that the potentially folded autibsp+ret -> retab -;; is handled correctly - currently we inhibit producing retab here. - -; CHECK-LABEL: func2: -; CHECK-NEXT: .seh_proc func2 -; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp -; CHECK-NEXT: .seh_pac_sign_lr -; CHECK-NEXT: str x19, [sp, #-16]! -; CHECK-NEXT: .seh_save_reg_x x19, 16 -; CHECK-NEXT: str x30, [sp, #8] -; CHECK-NEXT: .seh_save_reg x30, 8 -; CHECK-NEXT: .seh_endprologue - -; CHECK: .seh_startepilogue -; CHECK-NEXT: ldr x30, [sp, #8] -; CHECK-NEXT: .seh_save_reg x30, 8 -; CHECK-NEXT: ldr x19, [sp], #16 -; CHECK-NEXT: .seh_save_reg_x x19, 16 -; CHECK-NEXT: autibsp -; CHECK-NEXT: .seh_pac_sign_lr -; CHECK-NEXT: .seh_endepilogue -; CHECK-NEXT: ret -; CHECK-NEXT: .seh_endfunclet -; CHECK-NEXT: .seh_endproc