From be2e600357e10d481d05e8aad6b85c06031ac4f7 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Mon, 16 May 2016 14:43:06 +0000 Subject: [PATCH] Merging r263139: ------------------------------------------------------------------------ r263139 | michael.kuperstein | 2016-03-10 10:43:21 -0800 (Thu, 10 Mar 2016) | 12 lines [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 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_38@269657 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86FrameLowering.cpp | 4 +++- test/CodeGen/X86/pop-stack-cleanup.ll | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 75894e6734c..3348e56bc77 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -2440,7 +2440,9 @@ 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->isSubRegisterEq(MO.getReg(), Candidate) || + TRI->isSuperRegister(MO.getReg(), Candidate))) { IsDef = true; break; } diff --git a/test/CodeGen/X86/pop-stack-cleanup.ll b/test/CodeGen/X86/pop-stack-cleanup.ll index bcf7594065f..1738ccff54e 100644 --- a/test/CodeGen/X86/pop-stack-cleanup.ll +++ b/test/CodeGen/X86/pop-stack-cleanup.ll @@ -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 +} -- 2.50.1