OSDN Git Service

[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)
commitc1c411e7a86a341ddbfe3abfae0df40c8d233165
treeb271cf0a98fe98af73eedc92fb074da9f2598e11
parentc305f3d45a57fa0121c73b685e000692186b7cb0
[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317551 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/pop-stack-cleanup-msvc.ll [new file with mode: 0644]