diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index 9adac067aace8..83b11eede829e 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -562,7 +562,7 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const { Reserved.set(SubReg); // Set the frame-pointer register and its aliases as reserved if needed. - if (TFI->hasFP(MF)) { + if (TFI->hasFP(MF) || MF.getTarget().Options.FramePointerIsReserved(MF)) { if (MF.getInfo()->getFPClobberedByInvoke()) MF.getContext().reportError( SMLoc(), diff --git a/llvm/test/CodeGen/X86/frame-pointer-reserved.ll b/llvm/test/CodeGen/X86/frame-pointer-reserved.ll new file mode 100644 index 0000000000000..bf5887fe50508 --- /dev/null +++ b/llvm/test/CodeGen/X86/frame-pointer-reserved.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s + +declare void @bar(i32, i32) + +define void @foo(i32 %0, i32 %1) nounwind "frame-pointer"="reserved" { +; CHECK-LABEL: foo: +; CHECK: # %bb.0: +; CHECK-NEXT: pushq %r14 +; CHECK-NEXT: pushq %rbx +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: movl %esi, %ebx +; CHECK-NEXT: movl %edi, %r14d +; CHECK-NEXT: callq bar@PLT +; CHECK-NEXT: movl %r14d, %edi +; CHECK-NEXT: movl %ebx, %esi +; CHECK-NEXT: callq bar@PLT +; CHECK-NEXT: addq $8, %rsp +; CHECK-NEXT: popq %rbx +; CHECK-NEXT: popq %r14 +; CHECK-NEXT: retq + call void @bar(i32 %0, i32 %1) + call void @bar(i32 %0, i32 %1) + ret void +}