[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:
Reid Kleckner
2019-01-15 01:24:18 +00:00
parent 95389c7860
commit df7e021820
3 changed files with 22 additions and 1 deletions
+2 -1
View File
@@ -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;
}
}
+10
View File
@@ -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
}
+10
View File
@@ -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
}