Index: llvm/lib/Target/AArch64/AArch64FrameLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -390,6 +390,9 @@ // - sign-return-address=non-leaf and the functions spills the LR const Function &F = MF.getFunction(); + if (F.hasFnAttribute(Attribute::NoReturn)) + return false; + if (!F.hasFnAttribute("sign-return-address")) return false; Index: llvm/test/CodeGen/AArch64/sign-return-address.ll =================================================================== --- llvm/test/CodeGen/AArch64/sign-return-address.ll +++ llvm/test/CodeGen/AArch64/sign-return-address.ll @@ -118,7 +118,13 @@ ; CHECK: pacibsp ; CHECK-NOT: ret ; CHECK: retab -; CHECK-NOT: ret +; CHECK-NOT: ret{{$}} define i32 @leaf_sign_all_v83_b_key(i32 %x) "sign-return-address"="all" "target-features"="+v8.3a" "sign-return-address-key"="b_key" { ret i32 %x } + +; CHECK-LABEL: @noreturn_nosign +; CHECK-NOT: pacibsp +define i32 @noreturn_nosign(i32 %x) "sign-return-address"="all" noreturn { + ret i32 %x +}