[X86] Correctly select registers to pop into for x86_64

When trying to replace an add to esp with pops, we need to choose dead
registers to pop into. Registers clobbered by the call and not imp-def'd
by it should be safe. Except that it's not enough to check the register
itself isn't defined, we also need to make sure no overlapping registers
are defined either.

This fixes PR26711.

Differential Revision: http://reviews.llvm.org/D18029

llvm-svn: 263139
This commit is contained in:
Michael Kuperstein 2016-03-10 18:43:21 +00:00
parent f0b1f09389
commit 8be8de6d62
2 changed files with 13 additions and 1 deletions

View File

@ -2447,7 +2447,8 @@ bool X86FrameLowering::adjustStackWithPops(MachineBasicBlock &MBB,
bool IsDef = false;
for (const MachineOperand &MO : Prev->implicit_operands()) {
if (MO.isReg() && MO.isDef() && MO.getReg() == Candidate) {
if (MO.isReg() && MO.isDef() &&
TRI->isSuperOrSubRegisterEq(MO.getReg(), Candidate)) {
IsDef = true;
break;
}

View File

@ -7,6 +7,7 @@ declare i64 @param2_ret64(i32 %a, i32 %b)
declare void @param2(i32 %a, i32 %b)
declare void @param3(i32 %a, i32 %b, i32 %c)
declare void @param8(i64, i64, i64, i64, i64, i64, i64, i64)
declare i32 @param8_ret(i64, i64, i64, i64, i64, i64, i64, i64)
define void @test() minsize nounwind {
@ -74,3 +75,13 @@ define void @test_linux64(i32 %size) minsize nounwind {
call void @param8(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8)
ret void
}
define i32 @test_linux64_i32(i32 %size) minsize nounwind {
; LINUX64-LABEL: test_linux64_i32:
; LINUX64: callq param8_ret
; LINUX64-NOT: popq %rax
; LINUX64: retq
%a = alloca i64, i32 %size, align 8
%r = call i32 @param8_ret(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8)
ret i32 %r
}