Index: llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
--- llvm/lib/Target/AArch64/AArch64FrameLowering.cpp.orig
+++ llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -218,6 +218,7 @@
 #include "AArch64MachineFunctionInfo.h"
 #include "AArch64PrologueEpilogue.h"
 #include "AArch64RegisterInfo.h"
+#include "AArch64ReturnProtectorLowering.h"
 #include "AArch64SMEAttributes.h"
 #include "AArch64Subtarget.h"
 #include "MCTargetDesc/AArch64AddressingModes.h"
@@ -2511,6 +2512,10 @@ void AArch64FrameLowering::determineCalleeSaves(Machin
   MCRegister BasePointerReg =
       RegInfo->hasBasePointer(MF) ? RegInfo->getBaseRegister() : MCRegister();
 
+  if (MFI.hasReturnProtectorRegister() && MFI.getReturnProtectorNeedsStore()) {
+    SavedRegs.set(MFI.getReturnProtectorRegister());
+  }
+
   unsigned ExtraCSSpill = 0;
   bool HasUnpairedGPR64 = false;
   bool HasPairZReg = false;
@@ -3538,6 +3543,10 @@ unsigned AArch64FrameLowering::getWinEHFuncletFrameSiz
   // This is the amount of stack a funclet needs to allocate.
   return alignTo(CSSize + MF.getFrameInfo().getMaxCallFrameSize(),
                  getStackAlign());
+}
+
+const ReturnProtectorLowering *AArch64FrameLowering::getReturnProtector() const {
+  return &RPL;
 }
 
 namespace {
