[llvm] [AArch64] Fix the emission of WinCFI for pac-ret+leaf and SCS (PR #147518)

Anatoly Trosinenko via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 11 04:13:52 PDT 2025


https://github.com/atrosinenko updated https://github.com/llvm/llvm-project/pull/147518

>From a36ad2933e054baa0331509169b2dc6e39e39707 Mon Sep 17 00:00:00 2001
From: Anatoly Trosinenko <atrosinenko at accesssoftek.com>
Date: Tue, 8 Jul 2025 14:51:42 +0300
Subject: [PATCH 1/3] [AArch64] Fix the emission of WinCFI for pac-ret+leaf and
 SCS

This commit fixes WinCFI opcodes being incorrectly emitted for test
cases in sign-return-address.ll.

Emit SEH_Nop opcode in emitShadowCallStackEpilogue the same way it
is done in emitShadowCallStackPrologue function - this fixes

    12 bytes of instructions in range, but .seh directives corresponding to 8 bytes

error being reported for the epilogue of non_leaf_scs function.

Emit SEH_PrologEnd on the code path in emitPrologue function that may be
taken when pac-ret protection is emitted for a leaf function - this
fixes errors like the following:

    starting epilogue (.seh_startepilogue) before prologue has ended (.seh_endprologue) in leaf_sign_all_v83
    Stray .seh_endepilogue in leaf_sign_all_v83
---
 .../Target/AArch64/AArch64FrameLowering.cpp   | 32 +++++++++++++------
 .../CodeGen/AArch64/sign-return-address.ll    |  5 +++
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index 666ff8bbab42a..00fbeef9d35df 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -1746,7 +1746,7 @@ static void emitShadowCallStackEpilogue(const TargetInstrInfo &TII,
                                         MachineFunction &MF,
                                         MachineBasicBlock &MBB,
                                         MachineBasicBlock::iterator MBBI,
-                                        const DebugLoc &DL) {
+                                        const DebugLoc &DL, bool NeedsWinCFI) {
   // Shadow call stack epilog: ldr x30, [x18, #-8]!
   BuildMI(MBB, MBBI, DL, TII.get(AArch64::LDRXpre))
       .addReg(AArch64::X18, RegState::Define)
@@ -1755,6 +1755,10 @@ static void emitShadowCallStackEpilogue(const TargetInstrInfo &TII,
       .addImm(-8)
       .setMIFlag(MachineInstr::FrameDestroy);
 
+  if (NeedsWinCFI)
+    BuildMI(MBB, MBBI, DL, TII.get(AArch64::SEH_Nop))
+        .setMIFlag(MachineInstr::FrameDestroy);
+
   if (MF.getInfo<AArch64FunctionInfo>()->needsAsyncDwarfUnwindInfo(MF))
     CFIInstBuilder(MBB, MBBI, MachineInstr::FrameDestroy)
         .buildRestore(AArch64::X18);
@@ -1899,13 +1903,15 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
       BuildMI(MBB, MBBI, DL, TII->get(AArch64::PAUTH_PROLOGUE))
           .setMIFlag(MachineInstr::FrameSetup);
     }
-    if (NeedsWinCFI)
-      HasWinCFI = true; // AArch64PointerAuth pass will insert SEH_PACSignLR
+    // AArch64PointerAuth pass will insert SEH_PACSignLR
+    HasWinCFI |= NeedsWinCFI;
   }
 
-  if (MFnI.needsShadowCallStackPrologueEpilogue(MF))
+  if (MFnI.needsShadowCallStackPrologueEpilogue(MF)) {
     emitShadowCallStackPrologue(*TII, MF, MBB, MBBI, DL, NeedsWinCFI,
                                 MFnI.needsDwarfUnwindInfo(MF));
+    HasWinCFI |= NeedsWinCFI;
+  }
 
   if (EmitCFI && MFnI.isMTETagged()) {
     BuildMI(MBB, MBBI, DL, TII->get(AArch64::EMITMTETAGGED))
@@ -1990,8 +1996,13 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
            "unexpected function without stack frame but with SVE objects");
     // All of the stack allocation is for locals.
     AFI->setLocalStackSize(NumBytes);
-    if (!NumBytes)
+    if (!NumBytes) {
+      if (NeedsWinCFI && HasWinCFI) {
+        BuildMI(MBB, MBBI, DL, TII->get(AArch64::SEH_PrologEnd))
+            .setMIFlag(MachineInstr::FrameSetup);
+      }
       return;
+    }
     // REDZONE: If the stack size is less than 128 bytes, we don't need
     // to actually allocate.
     if (canUseRedZone(MF)) {
@@ -2460,8 +2471,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
   MachineBasicBlock::iterator EpilogStartI = MBB.end();
 
   auto FinishingTouches = make_scope_exit([&]() {
-    if (AFI->needsShadowCallStackPrologueEpilogue(MF))
-      emitShadowCallStackEpilogue(*TII, MF, MBB, MBB.getFirstTerminator(), DL);
+    if (AFI->needsShadowCallStackPrologueEpilogue(MF)) {
+      emitShadowCallStackEpilogue(*TII, MF, MBB, MBB.getFirstTerminator(), DL,
+                                  NeedsWinCFI);
+      HasWinCFI |= NeedsWinCFI;
+    }
     if (EmitCFI)
       emitCalleeSavedGPRRestores(MBB, MBB.getFirstTerminator());
     if (AFI->shouldSignReturnAddress(MF)) {
@@ -2472,8 +2486,8 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
                 TII->get(AArch64::PAUTH_EPILOGUE))
             .setMIFlag(MachineInstr::FrameDestroy);
       }
-      if (NeedsWinCFI)
-        HasWinCFI = true; // AArch64PointerAuth pass will insert SEH_PACSignLR
+      // AArch64PointerAuth pass will insert SEH_PACSignLR
+      HasWinCFI |= NeedsWinCFI;
     }
     if (HasWinCFI) {
       BuildMI(MBB, MBB.getFirstTerminator(), DL,
diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll
index b0ab4775cb388..a1e819240f888 100644
--- a/llvm/test/CodeGen/AArch64/sign-return-address.ll
+++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll
@@ -5,6 +5,11 @@
 ; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse V83A.
 ; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,V83A %s
 
+; Make sure no errors are detected when emitting SEH opcodes.
+; Errors are only checked for when generating a binary, so emit a dummy object
+; file and make sure llc produces zero exit code.
+; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %s
+
 define i32 @leaf(i32 %x) {
 ; CHECK-LABEL: leaf:
 ; CHECK:       // %bb.0:

>From 8283078ef283bac62b530049c77c03763dc41d5e Mon Sep 17 00:00:00 2001
From: Anatoly Trosinenko <atrosinenko at accesssoftek.com>
Date: Fri, 11 Jul 2025 13:31:02 +0300
Subject: [PATCH 2/3] Add CHECK lines for WinCFI assembly output

---
 .../CodeGen/AArch64/sign-return-address.ll    | 539 ++++++++++++++++--
 1 file changed, 504 insertions(+), 35 deletions(-)

diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll
index a1e819240f888..e71b710268943 100644
--- a/llvm/test/CodeGen/AArch64/sign-return-address.ll
+++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll
@@ -1,14 +1,18 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -mtriple=aarch64              < %s | FileCheck --check-prefixes=CHECK,COMPAT %s
-; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,V83A %s
+; RUN: llc -mtriple=aarch64              < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,COMPAT %s
+; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,V83A %s
 
 ; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse V83A.
-; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,V83A %s
+; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,V83A %s
+
+; RUN: llc -mtriple=aarch64-windows              < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s
 
 ; Make sure no errors are detected when emitting SEH opcodes.
 ; Errors are only checked for when generating a binary, so emit a dummy object
 ; file and make sure llc produces zero exit code.
-; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %s
+; RUN: llc -mtriple=aarch64-windows              -o %t.dummy.o --filetype=obj < %s
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a -o %t.dummy.o --filetype=obj < %s
 
 define i32 @leaf(i32 %x) {
 ; CHECK-LABEL: leaf:
@@ -44,6 +48,34 @@ define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {
 ; V83A-NEXT:    paciasp
 ; V83A-NEXT:    .cfi_negate_ra_state
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all:
+; WINCFI-COMPAT:       .seh_proc leaf_sign_all
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all:
+; WINCFI-V83A:       .seh_proc leaf_sign_all
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   ret i32 %x
 }
 
@@ -74,6 +106,48 @@ define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf"  {
 ; V83A-NEXT:    //NO_APP
 ; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_clobbers_lr:
+; WINCFI-COMPAT:       .seh_proc leaf_clobbers_lr
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    //APP
+; WINCFI-COMPAT-NEXT:    mov x30, x0
+; WINCFI-COMPAT-NEXT:    //NO_APP
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_clobbers_lr:
+; WINCFI-V83A:       .seh_proc leaf_clobbers_lr
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    //APP
+; WINCFI-V83A-NEXT:    mov x30, x0
+; WINCFI-V83A-NEXT:    //NO_APP
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
   ret i64 %x
 }
@@ -103,6 +177,44 @@ define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {
 ; V83A-NEXT:    bl foo
 ; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: non_leaf_sign_all:
+; WINCFI-COMPAT:       .seh_proc non_leaf_sign_all
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    bl foo
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: non_leaf_sign_all:
+; WINCFI-V83A:       .seh_proc non_leaf_sign_all
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    bl foo
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   %call = call i32 @foo(i32 %x)
   ret i32 %call
 }
@@ -130,26 +242,87 @@ define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf"  {
 ; V83A-NEXT:    bl foo
 ; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:
+; WINCFI-COMPAT:       .seh_proc non_leaf_sign_non_leaf
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    bl foo
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: non_leaf_sign_non_leaf:
+; WINCFI-V83A:       .seh_proc non_leaf_sign_non_leaf
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    bl foo
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   %call = call i32 @foo(i32 %x)
   ret i32 %call
 }
 
 ; Should not use the RETAA instruction.
 define i32 @non_leaf_scs(i32 %x) "sign-return-address"="non-leaf" shadowcallstack "target-features"="+v8.3a,+reserve-x18"  {
-; CHECK-LABEL: non_leaf_scs:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    paciasp
-; CHECK-NEXT:    .cfi_negate_ra_state
-; CHECK-NEXT:    str x30, [x18], #8
-; CHECK-NEXT:    .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
-; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
-; CHECK-NEXT:    .cfi_offset w30, -16
-; CHECK-NEXT:    bl foo
-; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-NEXT:    ldr x30, [x18, #-8]!
-; CHECK-NEXT:    autiasp
-; CHECK-NEXT:    ret
+; DWARFCFI-LABEL: non_leaf_scs:
+; DWARFCFI:       // %bb.0:
+; DWARFCFI-NEXT:    paciasp
+; DWARFCFI-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-NEXT:    str x30, [x18], #8
+; DWARFCFI-NEXT:    .cfi_escape 0x16, 0x12, 0x02, 0x82, 0x78 //
+; DWARFCFI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-NEXT:    bl foo
+; DWARFCFI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-NEXT:    ldr x30, [x18, #-8]!
+; DWARFCFI-NEXT:    autiasp
+; DWARFCFI-NEXT:    ret
+;
+; WINCFI-LABEL: non_leaf_scs:
+; WINCFI:       .seh_proc non_leaf_scs
+; WINCFI-NEXT:  // %bb.0:
+; WINCFI-NEXT:    pacibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    str x30, [x18], #8
+; WINCFI-NEXT:    .seh_nop
+; WINCFI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-NEXT:    .seh_endprologue
+; WINCFI-NEXT:    bl foo
+; WINCFI-NEXT:    .seh_startepilogue
+; WINCFI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-NEXT:    ldr x30, [x18, #-8]!
+; WINCFI-NEXT:    .seh_nop
+; WINCFI-NEXT:    autibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endepilogue
+; WINCFI-NEXT:    ret
+; WINCFI-NEXT:    .seh_endfunclet
+; WINCFI-NEXT:    .seh_endproc
   %call = call i32 @foo(i32 %x)
   ret i32 %call
 }
@@ -199,6 +372,56 @@ define void @shrink_wrap_sign_non_leaf(i32 %x, i32 %cond) "sign-return-address"=
 ; V83A-NEXT:    mov w9, #42 // =0x2a
 ; V83A-NEXT:    str x9, [x8, :lo12:var]
 ; V83A-NEXT:    ret
+;
+; WINCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:
+; WINCFI-COMPAT:       .seh_proc shrink_wrap_sign_non_leaf
+; WINCFI-COMPAT-NEXT:  // %bb.0: // %entry
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    cbnz w1, .LBB8_2
+; WINCFI-COMPAT-NEXT:  // %bb.1: // %if.then
+; WINCFI-COMPAT-NEXT:    bl foo
+; WINCFI-COMPAT-NEXT:  .LBB8_2: // %exit
+; WINCFI-COMPAT-NEXT:    adrp x8, var
+; WINCFI-COMPAT-NEXT:    mov w9, #42 // =0x2a
+; WINCFI-COMPAT-NEXT:    str x9, [x8, :lo12:var]
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:
+; WINCFI-V83A:       .seh_proc shrink_wrap_sign_non_leaf
+; WINCFI-V83A-NEXT:  // %bb.0: // %entry
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    cbnz w1, .LBB8_2
+; WINCFI-V83A-NEXT:  // %bb.1: // %if.then
+; WINCFI-V83A-NEXT:    bl foo
+; WINCFI-V83A-NEXT:  .LBB8_2: // %exit
+; WINCFI-V83A-NEXT:    adrp x8, var
+; WINCFI-V83A-NEXT:    mov w9, #42 // =0x2a
+; WINCFI-V83A-NEXT:    str x9, [x8, :lo12:var]
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
 entry:
   %cond.bool = icmp eq i32 %cond, 0
   br i1 %cond.bool, label %if.then, label %exit
@@ -252,6 +475,56 @@ define void @shrink_wrap_sign_all(i32 %x, i32 %cond) "sign-return-address"="all"
 ; V83A-NEXT:    mov w9, #42 // =0x2a
 ; V83A-NEXT:    str x9, [x8, :lo12:var]
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: shrink_wrap_sign_all:
+; WINCFI-COMPAT:       .seh_proc shrink_wrap_sign_all
+; WINCFI-COMPAT-NEXT:  // %bb.0: // %entry
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    cbnz w1, .LBB9_2
+; WINCFI-COMPAT-NEXT:  // %bb.1: // %if.then
+; WINCFI-COMPAT-NEXT:    bl foo
+; WINCFI-COMPAT-NEXT:  .LBB9_2: // %exit
+; WINCFI-COMPAT-NEXT:    adrp x8, var
+; WINCFI-COMPAT-NEXT:    mov w9, #42 // =0x2a
+; WINCFI-COMPAT-NEXT:    str x9, [x8, :lo12:var]
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: shrink_wrap_sign_all:
+; WINCFI-V83A:       .seh_proc shrink_wrap_sign_all
+; WINCFI-V83A-NEXT:  // %bb.0: // %entry
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    cbnz w1, .LBB9_2
+; WINCFI-V83A-NEXT:  // %bb.1: // %if.then
+; WINCFI-V83A-NEXT:    bl foo
+; WINCFI-V83A-NEXT:  .LBB9_2: // %exit
+; WINCFI-V83A-NEXT:    adrp x8, var
+; WINCFI-V83A-NEXT:    mov w9, #42 // =0x2a
+; WINCFI-V83A-NEXT:    str x9, [x8, :lo12:var]
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
 entry:
   %cond.bool = icmp eq i32 %cond, 0
   br i1 %cond.bool, label %if.then, label %exit
@@ -264,11 +537,25 @@ exit:
 }
 
 define i32 @leaf_sign_all_v83(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" {
-; CHECK-LABEL: leaf_sign_all_v83:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    paciasp
-; CHECK-NEXT:    .cfi_negate_ra_state
-; CHECK-NEXT:    retaa
+; DWARFCFI-LABEL: leaf_sign_all_v83:
+; DWARFCFI:       // %bb.0:
+; DWARFCFI-NEXT:    paciasp
+; DWARFCFI-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-NEXT:    retaa
+;
+; WINCFI-LABEL: leaf_sign_all_v83:
+; WINCFI:       .seh_proc leaf_sign_all_v83
+; WINCFI-NEXT:  // %bb.0:
+; WINCFI-NEXT:    pacibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endprologue
+; WINCFI-NEXT:    .seh_startepilogue
+; WINCFI-NEXT:    autibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endepilogue
+; WINCFI-NEXT:    ret
+; WINCFI-NEXT:    .seh_endfunclet
+; WINCFI-NEXT:    .seh_endproc
   ret i32 %x
 }
 
@@ -302,6 +589,48 @@ define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {
 ; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; V83A-NEXT:    autiasp
 ; V83A-NEXT:    b bar
+;
+; WINCFI-COMPAT-LABEL: spill_lr_and_tail_call:
+; WINCFI-COMPAT:       .seh_proc spill_lr_and_tail_call
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    //APP
+; WINCFI-COMPAT-NEXT:    mov x30, x0
+; WINCFI-COMPAT-NEXT:    //NO_APP
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-COMPAT-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    b bar
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: spill_lr_and_tail_call:
+; WINCFI-V83A:       .seh_proc spill_lr_and_tail_call
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    //APP
+; WINCFI-V83A-NEXT:    mov x30, x0
+; WINCFI-V83A-NEXT:    //NO_APP
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINCFI-V83A-NEXT:    .seh_save_reg_x x30, 16
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    b bar
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1
   tail call fastcc i64 @bar(i64 %x)
   ret void
@@ -320,6 +649,34 @@ define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return
 ; V83A-NEXT:    paciasp
 ; V83A-NEXT:    .cfi_negate_ra_state
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key:
+; WINCFI-COMPAT:       .seh_proc leaf_sign_all_a_key
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #25
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    hint #29
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_a_key:
+; WINCFI-V83A:       .seh_proc leaf_sign_all_a_key
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    paciasp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    autiasp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   ret i32 %x
 }
 
@@ -338,16 +695,58 @@ define i32 @leaf_sign_all_b_key(i32 %x) "sign-return-address"="all" "sign-return
 ; V83A-NEXT:    pacibsp
 ; V83A-NEXT:    .cfi_negate_ra_state
 ; V83A-NEXT:    retab
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key:
+; WINCFI-COMPAT:       .seh_proc leaf_sign_all_b_key
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_b_key:
+; WINCFI-V83A:       .seh_proc leaf_sign_all_b_key
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   ret i32 %x
 }
 
 define i32 @leaf_sign_all_v83_b_key(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" {
-; CHECK-LABEL: leaf_sign_all_v83_b_key:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    .cfi_b_key_frame
-; CHECK-NEXT:    pacibsp
-; CHECK-NEXT:    .cfi_negate_ra_state
-; CHECK-NEXT:    retab
+; DWARFCFI-LABEL: leaf_sign_all_v83_b_key:
+; DWARFCFI:       // %bb.0:
+; DWARFCFI-NEXT:    .cfi_b_key_frame
+; DWARFCFI-NEXT:    pacibsp
+; DWARFCFI-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-NEXT:    retab
+;
+; WINCFI-LABEL: leaf_sign_all_v83_b_key:
+; WINCFI:       .seh_proc leaf_sign_all_v83_b_key
+; WINCFI-NEXT:  // %bb.0:
+; WINCFI-NEXT:    pacibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endprologue
+; WINCFI-NEXT:    .seh_startepilogue
+; WINCFI-NEXT:    autibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endepilogue
+; WINCFI-NEXT:    ret
+; WINCFI-NEXT:    .seh_endfunclet
+; WINCFI-NEXT:    .seh_endproc
   ret i32 %x
 }
 
@@ -365,6 +764,34 @@ define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-re
 ; V83A-NEXT:    paciasp
 ; V83A-NEXT:    .cfi_negate_ra_state
 ; V83A-NEXT:    retaa
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
+; WINCFI-COMPAT:       .seh_proc leaf_sign_all_a_key_bti
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #25
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    hint #29
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_a_key_bti:
+; WINCFI-V83A:       .seh_proc leaf_sign_all_a_key_bti
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    paciasp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    autiasp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   ret i32 %x
 }
 
@@ -384,16 +811,58 @@ define i32 @leaf_sign_all_b_key_bti(i32 %x) "sign-return-address"="all" "sign-re
 ; V83A-NEXT:    pacibsp
 ; V83A-NEXT:    .cfi_negate_ra_state
 ; V83A-NEXT:    retab
+;
+; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:
+; WINCFI-COMPAT:       .seh_proc leaf_sign_all_b_key_bti
+; WINCFI-COMPAT-NEXT:  // %bb.0:
+; WINCFI-COMPAT-NEXT:    hint #27
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endprologue
+; WINCFI-COMPAT-NEXT:    .seh_startepilogue
+; WINCFI-COMPAT-NEXT:    hint #31
+; WINCFI-COMPAT-NEXT:    .seh_pac_sign_lr
+; WINCFI-COMPAT-NEXT:    .seh_endepilogue
+; WINCFI-COMPAT-NEXT:    ret
+; WINCFI-COMPAT-NEXT:    .seh_endfunclet
+; WINCFI-COMPAT-NEXT:    .seh_endproc
+;
+; WINCFI-V83A-LABEL: leaf_sign_all_b_key_bti:
+; WINCFI-V83A:       .seh_proc leaf_sign_all_b_key_bti
+; WINCFI-V83A-NEXT:  // %bb.0:
+; WINCFI-V83A-NEXT:    pacibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endprologue
+; WINCFI-V83A-NEXT:    .seh_startepilogue
+; WINCFI-V83A-NEXT:    autibsp
+; WINCFI-V83A-NEXT:    .seh_pac_sign_lr
+; WINCFI-V83A-NEXT:    .seh_endepilogue
+; WINCFI-V83A-NEXT:    ret
+; WINCFI-V83A-NEXT:    .seh_endfunclet
+; WINCFI-V83A-NEXT:    .seh_endproc
   ret i32 %x
 }
 
 ; Note that BTI instruction is not needed before PACIBSP.
 define i32 @leaf_sign_all_v83_b_key_bti(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" "branch-target-enforcement" {
-; CHECK-LABEL: leaf_sign_all_v83_b_key_bti:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    .cfi_b_key_frame
-; CHECK-NEXT:    pacibsp
-; CHECK-NEXT:    .cfi_negate_ra_state
-; CHECK-NEXT:    retab
+; DWARFCFI-LABEL: leaf_sign_all_v83_b_key_bti:
+; DWARFCFI:       // %bb.0:
+; DWARFCFI-NEXT:    .cfi_b_key_frame
+; DWARFCFI-NEXT:    pacibsp
+; DWARFCFI-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-NEXT:    retab
+;
+; WINCFI-LABEL: leaf_sign_all_v83_b_key_bti:
+; WINCFI:       .seh_proc leaf_sign_all_v83_b_key_bti
+; WINCFI-NEXT:  // %bb.0:
+; WINCFI-NEXT:    pacibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endprologue
+; WINCFI-NEXT:    .seh_startepilogue
+; WINCFI-NEXT:    autibsp
+; WINCFI-NEXT:    .seh_pac_sign_lr
+; WINCFI-NEXT:    .seh_endepilogue
+; WINCFI-NEXT:    ret
+; WINCFI-NEXT:    .seh_endfunclet
+; WINCFI-NEXT:    .seh_endproc
   ret i32 %x
 }

>From 030554d4e95704ade7a3d9ba2eb8c9747570cbea Mon Sep 17 00:00:00 2001
From: Anatoly Trosinenko <atrosinenko at accesssoftek.com>
Date: Fri, 11 Jul 2025 13:33:27 +0300
Subject: [PATCH 3/3] Add DWARFCFI- to COMPAT and V83A check lines

---
 .../CodeGen/AArch64/sign-return-address.ll    | 490 +++++++++---------
 1 file changed, 245 insertions(+), 245 deletions(-)

diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll
index e71b710268943..7267ce0e3afbf 100644
--- a/llvm/test/CodeGen/AArch64/sign-return-address.ll
+++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll
@@ -1,9 +1,9 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -mtriple=aarch64              < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,COMPAT %s
-; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,V83A %s
+; RUN: llc -mtriple=aarch64              < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-COMPAT %s
+; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s
 
-; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse V83A.
-; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,V83A %s
+; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse DWARFCFI-V83A.
+; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s
 
 ; RUN: llc -mtriple=aarch64-windows              < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s
 ; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s
@@ -36,18 +36,18 @@ define i32 @leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf"  {
 }
 
 define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: leaf_sign_all:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_sign_all:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: leaf_sign_all:
 ; WINCFI-COMPAT:       .seh_proc leaf_sign_all
@@ -80,32 +80,32 @@ define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" {
 }
 
 define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf"  {
-; COMPAT-LABEL: leaf_clobbers_lr:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    //APP
-; COMPAT-NEXT:    mov x30, x0
-; COMPAT-NEXT:    //NO_APP
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_clobbers_lr:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    //APP
-; V83A-NEXT:    mov x30, x0
-; V83A-NEXT:    //NO_APP
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: leaf_clobbers_lr:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    //APP
+; DWARFCFI-COMPAT-NEXT:    mov x30, x0
+; DWARFCFI-COMPAT-NEXT:    //NO_APP
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_clobbers_lr:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    //APP
+; DWARFCFI-V83A-NEXT:    mov x30, x0
+; DWARFCFI-V83A-NEXT:    //NO_APP
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: leaf_clobbers_lr:
 ; WINCFI-COMPAT:       .seh_proc leaf_clobbers_lr
@@ -155,28 +155,28 @@ define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf"  {
 declare i32 @foo(i32)
 
 define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: non_leaf_sign_all:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    bl foo
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: non_leaf_sign_all:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    bl foo
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: non_leaf_sign_all:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    bl foo
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: non_leaf_sign_all:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    bl foo
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: non_leaf_sign_all:
 ; WINCFI-COMPAT:       .seh_proc non_leaf_sign_all
@@ -220,28 +220,28 @@ define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" {
 }
 
 define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf"  {
-; COMPAT-LABEL: non_leaf_sign_non_leaf:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    bl foo
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: non_leaf_sign_non_leaf:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    bl foo
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    bl foo
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: non_leaf_sign_non_leaf:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    bl foo
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: non_leaf_sign_non_leaf:
 ; WINCFI-COMPAT:       .seh_proc non_leaf_sign_non_leaf
@@ -331,47 +331,47 @@ define i32 @non_leaf_scs(i32 %x) "sign-return-address"="non-leaf" shadowcallstac
 
 ; By default, pac-ret hardening respects shrink-wrapping optimization.
 define void @shrink_wrap_sign_non_leaf(i32 %x, i32 %cond) "sign-return-address"="non-leaf" uwtable(async) {
-; COMPAT-LABEL: shrink_wrap_sign_non_leaf:
-; COMPAT:       // %bb.0: // %entry
-; COMPAT-NEXT:    cbnz w1, .LBB8_2
-; COMPAT-NEXT:  // %bb.1: // %if.then
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    bl foo
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    .cfi_def_cfa_offset 0
-; COMPAT-NEXT:    .cfi_restore w30
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:  .LBB8_2: // %exit
-; COMPAT-NEXT:    adrp x8, var
-; COMPAT-NEXT:    mov w9, #42 // =0x2a
-; COMPAT-NEXT:    str x9, [x8, :lo12:var]
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: shrink_wrap_sign_non_leaf:
-; V83A:       // %bb.0: // %entry
-; V83A-NEXT:    cbnz w1, .LBB8_2
-; V83A-NEXT:  // %bb.1: // %if.then
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    bl foo
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    .cfi_def_cfa_offset 0
-; V83A-NEXT:    .cfi_restore w30
-; V83A-NEXT:    autiasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:  .LBB8_2: // %exit
-; V83A-NEXT:    adrp x8, var
-; V83A-NEXT:    mov w9, #42 // =0x2a
-; V83A-NEXT:    str x9, [x8, :lo12:var]
-; V83A-NEXT:    ret
+; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:
+; DWARFCFI-COMPAT:       // %bb.0: // %entry
+; DWARFCFI-COMPAT-NEXT:    cbnz w1, .LBB8_2
+; DWARFCFI-COMPAT-NEXT:  // %bb.1: // %if.then
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    bl foo
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 0
+; DWARFCFI-COMPAT-NEXT:    .cfi_restore w30
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:  .LBB8_2: // %exit
+; DWARFCFI-COMPAT-NEXT:    adrp x8, var
+; DWARFCFI-COMPAT-NEXT:    mov w9, #42 // =0x2a
+; DWARFCFI-COMPAT-NEXT:    str x9, [x8, :lo12:var]
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: shrink_wrap_sign_non_leaf:
+; DWARFCFI-V83A:       // %bb.0: // %entry
+; DWARFCFI-V83A-NEXT:    cbnz w1, .LBB8_2
+; DWARFCFI-V83A-NEXT:  // %bb.1: // %if.then
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    bl foo
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 0
+; DWARFCFI-V83A-NEXT:    .cfi_restore w30
+; DWARFCFI-V83A-NEXT:    autiasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:  .LBB8_2: // %exit
+; DWARFCFI-V83A-NEXT:    adrp x8, var
+; DWARFCFI-V83A-NEXT:    mov w9, #42 // =0x2a
+; DWARFCFI-V83A-NEXT:    str x9, [x8, :lo12:var]
+; DWARFCFI-V83A-NEXT:    ret
 ;
 ; WINCFI-COMPAT-LABEL: shrink_wrap_sign_non_leaf:
 ; WINCFI-COMPAT:       .seh_proc shrink_wrap_sign_non_leaf
@@ -436,45 +436,45 @@ exit:
 ; When "+leaf" is specified to harden everything, pac-ret hardens the entire
 ; function, ignoring shrink-wrapping.
 define void @shrink_wrap_sign_all(i32 %x, i32 %cond) "sign-return-address"="all" uwtable(async) {
-; COMPAT-LABEL: shrink_wrap_sign_all:
-; COMPAT:       // %bb.0: // %entry
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    cbnz w1, .LBB9_2
-; COMPAT-NEXT:  // %bb.1: // %if.then
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    bl foo
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    .cfi_def_cfa_offset 0
-; COMPAT-NEXT:    .cfi_restore w30
-; COMPAT-NEXT:  .LBB9_2: // %exit
-; COMPAT-NEXT:    adrp x8, var
-; COMPAT-NEXT:    mov w9, #42 // =0x2a
-; COMPAT-NEXT:    str x9, [x8, :lo12:var]
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: shrink_wrap_sign_all:
-; V83A:       // %bb.0: // %entry
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    cbnz w1, .LBB9_2
-; V83A-NEXT:  // %bb.1: // %if.then
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    bl foo
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    .cfi_def_cfa_offset 0
-; V83A-NEXT:    .cfi_restore w30
-; V83A-NEXT:  .LBB9_2: // %exit
-; V83A-NEXT:    adrp x8, var
-; V83A-NEXT:    mov w9, #42 // =0x2a
-; V83A-NEXT:    str x9, [x8, :lo12:var]
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: shrink_wrap_sign_all:
+; DWARFCFI-COMPAT:       // %bb.0: // %entry
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    cbnz w1, .LBB9_2
+; DWARFCFI-COMPAT-NEXT:  // %bb.1: // %if.then
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    bl foo
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 0
+; DWARFCFI-COMPAT-NEXT:    .cfi_restore w30
+; DWARFCFI-COMPAT-NEXT:  .LBB9_2: // %exit
+; DWARFCFI-COMPAT-NEXT:    adrp x8, var
+; DWARFCFI-COMPAT-NEXT:    mov w9, #42 // =0x2a
+; DWARFCFI-COMPAT-NEXT:    str x9, [x8, :lo12:var]
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: shrink_wrap_sign_all:
+; DWARFCFI-V83A:       // %bb.0: // %entry
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    cbnz w1, .LBB9_2
+; DWARFCFI-V83A-NEXT:  // %bb.1: // %if.then
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    bl foo
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 0
+; DWARFCFI-V83A-NEXT:    .cfi_restore w30
+; DWARFCFI-V83A-NEXT:  .LBB9_2: // %exit
+; DWARFCFI-V83A-NEXT:    adrp x8, var
+; DWARFCFI-V83A-NEXT:    mov w9, #42 // =0x2a
+; DWARFCFI-V83A-NEXT:    str x9, [x8, :lo12:var]
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: shrink_wrap_sign_all:
 ; WINCFI-COMPAT:       .seh_proc shrink_wrap_sign_all
@@ -562,33 +562,33 @@ define i32 @leaf_sign_all_v83(i32 %x) "sign-return-address"="all" "target-featur
 declare fastcc i64 @bar(i64)
 
 define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {
-; COMPAT-LABEL: spill_lr_and_tail_call:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; COMPAT-NEXT:    .cfi_def_cfa_offset 16
-; COMPAT-NEXT:    .cfi_offset w30, -16
-; COMPAT-NEXT:    //APP
-; COMPAT-NEXT:    mov x30, x0
-; COMPAT-NEXT:    //NO_APP
-; COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    b bar
-;
-; V83A-LABEL: spill_lr_and_tail_call:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; V83A-NEXT:    .cfi_def_cfa_offset 16
-; V83A-NEXT:    .cfi_offset w30, -16
-; V83A-NEXT:    //APP
-; V83A-NEXT:    mov x30, x0
-; V83A-NEXT:    //NO_APP
-; V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; V83A-NEXT:    autiasp
-; V83A-NEXT:    b bar
+; DWARFCFI-COMPAT-LABEL: spill_lr_and_tail_call:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-COMPAT-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-COMPAT-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-COMPAT-NEXT:    //APP
+; DWARFCFI-COMPAT-NEXT:    mov x30, x0
+; DWARFCFI-COMPAT-NEXT:    //NO_APP
+; DWARFCFI-COMPAT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    b bar
+;
+; DWARFCFI-V83A-LABEL: spill_lr_and_tail_call:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; DWARFCFI-V83A-NEXT:    .cfi_def_cfa_offset 16
+; DWARFCFI-V83A-NEXT:    .cfi_offset w30, -16
+; DWARFCFI-V83A-NEXT:    //APP
+; DWARFCFI-V83A-NEXT:    mov x30, x0
+; DWARFCFI-V83A-NEXT:    //NO_APP
+; DWARFCFI-V83A-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; DWARFCFI-V83A-NEXT:    autiasp
+; DWARFCFI-V83A-NEXT:    b bar
 ;
 ; WINCFI-COMPAT-LABEL: spill_lr_and_tail_call:
 ; WINCFI-COMPAT:       .seh_proc spill_lr_and_tail_call
@@ -637,18 +637,18 @@ define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" {
 }
 
 define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" {
-; COMPAT-LABEL: leaf_sign_all_a_key:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_sign_all_a_key:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key:
 ; WINCFI-COMPAT:       .seh_proc leaf_sign_all_a_key
@@ -681,20 +681,20 @@ define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return
 }
 
 define i32 @leaf_sign_all_b_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" {
-; COMPAT-LABEL: leaf_sign_all_b_key:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    .cfi_b_key_frame
-; COMPAT-NEXT:    hint #27
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    hint #31
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_sign_all_b_key:
-; V83A:       // %bb.0:
-; V83A-NEXT:    .cfi_b_key_frame
-; V83A-NEXT:    pacibsp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    retab
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    .cfi_b_key_frame
+; DWARFCFI-COMPAT-NEXT:    hint #27
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    hint #31
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    .cfi_b_key_frame
+; DWARFCFI-V83A-NEXT:    pacibsp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    retab
 ;
 ; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key:
 ; WINCFI-COMPAT:       .seh_proc leaf_sign_all_b_key
@@ -752,18 +752,18 @@ define i32 @leaf_sign_all_v83_b_key(i32 %x) "sign-return-address"="all" "target-
 
 ; Note that BTI instruction is not needed before PACIASP.
 define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" "branch-target-enforcement"{
-; COMPAT-LABEL: leaf_sign_all_a_key_bti:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    hint #25
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    hint #29
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_sign_all_a_key_bti:
-; V83A:       // %bb.0:
-; V83A-NEXT:    paciasp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    retaa
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    hint #25
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    hint #29
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_a_key_bti:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    paciasp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    retaa
 ;
 ; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
 ; WINCFI-COMPAT:       .seh_proc leaf_sign_all_a_key_bti
@@ -797,20 +797,20 @@ define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-re
 
 ; Note that BTI instruction is not needed before PACIBSP.
 define i32 @leaf_sign_all_b_key_bti(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" "branch-target-enforcement"{
-; COMPAT-LABEL: leaf_sign_all_b_key_bti:
-; COMPAT:       // %bb.0:
-; COMPAT-NEXT:    .cfi_b_key_frame
-; COMPAT-NEXT:    hint #27
-; COMPAT-NEXT:    .cfi_negate_ra_state
-; COMPAT-NEXT:    hint #31
-; COMPAT-NEXT:    ret
-;
-; V83A-LABEL: leaf_sign_all_b_key_bti:
-; V83A:       // %bb.0:
-; V83A-NEXT:    .cfi_b_key_frame
-; V83A-NEXT:    pacibsp
-; V83A-NEXT:    .cfi_negate_ra_state
-; V83A-NEXT:    retab
+; DWARFCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:
+; DWARFCFI-COMPAT:       // %bb.0:
+; DWARFCFI-COMPAT-NEXT:    .cfi_b_key_frame
+; DWARFCFI-COMPAT-NEXT:    hint #27
+; DWARFCFI-COMPAT-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-COMPAT-NEXT:    hint #31
+; DWARFCFI-COMPAT-NEXT:    ret
+;
+; DWARFCFI-V83A-LABEL: leaf_sign_all_b_key_bti:
+; DWARFCFI-V83A:       // %bb.0:
+; DWARFCFI-V83A-NEXT:    .cfi_b_key_frame
+; DWARFCFI-V83A-NEXT:    pacibsp
+; DWARFCFI-V83A-NEXT:    .cfi_negate_ra_state
+; DWARFCFI-V83A-NEXT:    retab
 ;
 ; WINCFI-COMPAT-LABEL: leaf_sign_all_b_key_bti:
 ; WINCFI-COMPAT:       .seh_proc leaf_sign_all_b_key_bti



More information about the llvm-commits mailing list