[X86] Don't clobber reserved registers with stack adjustments
authorBjorn Steinbrink <bsteinbr@gmail.com>
Tue, 7 Nov 2017 08:50:21 +0000 (08:50 +0000)
committerBjorn Steinbrink <bsteinbr@gmail.com>
Tue, 7 Nov 2017 08:50:21 +0000 (08:50 +0000)
commitc02b237e467c825d23cda36e178abf769629c9d0
tree1b5c578cbd6be2ad53c084b42b3d6d471a1e3440
parente7fb3002264eaa2b86e99430fd94acc1a487136d
[X86] Don't clobber reserved registers with stack adjustments

Summary:
Calls using invoke in funclet based functions are assumed to clobber
all registers, which causes the stack adjustment using pops to consider
all registers not defined by the call to be undefined, which can
unfortunately include the base pointer, if one is needed.

To prevent this (and possibly other hazards), skip reserved registers
when looking for candidate registers.

This fixes issue #45034 in the Rust compiler.

Reviewers: mkuper

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D39636

llvm-svn: 317551
llvm/lib/Target/X86/X86FrameLowering.cpp
llvm/test/CodeGen/X86/pop-stack-cleanup-msvc.ll [new file with mode: 0644]