mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[X86] Avoid clobbering ESP/RSP in the epilogue.
Summary: In r345197 ESP and RSP were added to GR32_TC/GR64_TC, allowing them to be used for tail calls, but this also caused `findDeadCallerSavedReg` to think they were acceptable targets for clobbering. Filter them out. Fixes PR40289. Patch by Geoffry Song! Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D56617 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351146 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -185,7 +185,8 @@ static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
|
||||
}
|
||||
|
||||
for (auto CS : AvailableRegs)
|
||||
if (!Uses.count(CS) && CS != X86::RIP)
|
||||
if (!Uses.count(CS) && CS != X86::RIP && CS != X86::RSP &&
|
||||
CS != X86::ESP)
|
||||
return CS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc | FileCheck %s
|
||||
|
||||
define cc 92 < 9 x i64 > @clobber() {
|
||||
%1 = alloca i64
|
||||
%2 = load volatile i64, i64* %1
|
||||
ret < 9 x i64 > undef
|
||||
; CHECK-LABEL: clobber:
|
||||
; CHECK-NOT: popq %rsp
|
||||
; CHECK: addq $8, %rsp
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
; RUN: llc < %s -mtriple=i686-pc-windows-msvc | FileCheck %s
|
||||
|
||||
define < 3 x i32 > @clobber() {
|
||||
%1 = alloca i32
|
||||
%2 = load volatile i32, i32* %1
|
||||
ret < 3 x i32 > undef
|
||||
; CHECK-LABEL: clobber:
|
||||
; CHECK-NOT: popl %esp
|
||||
; CHECK: addl $4, %esp
|
||||
}
|
||||
Reference in New Issue
Block a user