Skip to content

Commit 3083678

Browse files
authored
[X86] Don't use rbp when it's reserved (#146638)
This fixes the x86 backend to properly reserve `rbp` when the `frame-pointer=reserved` option is used. Currently, this option is ignored. Disassembly of the new test case before: ```s pushq %rbp pushq %rbx pushq %rax movl %esi, %ebx movl %edi, %ebp callq bar@PLT movl %ebp, %edi movl %ebx, %esi callq bar@PLT addq $8, %rsp popq %rbx popq %rbp retq ``` ...and after (`r14` is used as scratch space in place of `rbp`): ```s pushq %r14 pushq %rbx pushq %rax movl %esi, %ebx movl %edi, %r14d callq bar@PLT movl %r14d, %edi movl %ebx, %esi callq bar@PLT addq $8, %rsp popq %rbx popq %r14 retq ``` Fixes #117178.
1 parent 8a221a5 commit 3083678

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
562562
Reserved.set(SubReg);
563563

564564
// Set the frame-pointer register and its aliases as reserved if needed.
565-
if (TFI->hasFP(MF)) {
565+
if (TFI->hasFP(MF) || MF.getTarget().Options.FramePointerIsReserved(MF)) {
566566
if (MF.getInfo<X86MachineFunctionInfo>()->getFPClobberedByInvoke())
567567
MF.getContext().reportError(
568568
SMLoc(),
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3+
4+
declare void @bar(i32, i32)
5+
6+
define void @foo(i32 %0, i32 %1) nounwind "frame-pointer"="reserved" {
7+
; CHECK-LABEL: foo:
8+
; CHECK: # %bb.0:
9+
; CHECK-NEXT: pushq %r14
10+
; CHECK-NEXT: pushq %rbx
11+
; CHECK-NEXT: pushq %rax
12+
; CHECK-NEXT: movl %esi, %ebx
13+
; CHECK-NEXT: movl %edi, %r14d
14+
; CHECK-NEXT: callq bar@PLT
15+
; CHECK-NEXT: movl %r14d, %edi
16+
; CHECK-NEXT: movl %ebx, %esi
17+
; CHECK-NEXT: callq bar@PLT
18+
; CHECK-NEXT: addq $8, %rsp
19+
; CHECK-NEXT: popq %rbx
20+
; CHECK-NEXT: popq %r14
21+
; CHECK-NEXT: retq
22+
call void @bar(i32 %0, i32 %1)
23+
call void @bar(i32 %0, i32 %1)
24+
ret void
25+
}

0 commit comments

Comments
 (0)