Skip to content

Commit 7ca76af

Browse files
tstellarAMDalexcrichton
authored andcommitted
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
1 parent 80ad955 commit 7ca76af

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

lib/Target/X86/X86FrameLowering.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -2440,7 +2440,9 @@ bool X86FrameLowering::adjustStackWithPops(MachineBasicBlock &MBB,
24402440

24412441
bool IsDef = false;
24422442
for (const MachineOperand &MO : Prev->implicit_operands()) {
2443-
if (MO.isReg() && MO.isDef() && MO.getReg() == Candidate) {
2443+
if (MO.isReg() && MO.isDef() &&
2444+
(TRI->isSubRegisterEq(MO.getReg(), Candidate) ||
2445+
TRI->isSuperRegister(MO.getReg(), Candidate))) {
24442446
IsDef = true;
24452447
break;
24462448
}

test/CodeGen/X86/pop-stack-cleanup.ll

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ declare i64 @param2_ret64(i32 %a, i32 %b)
77
declare void @param2(i32 %a, i32 %b)
88
declare void @param3(i32 %a, i32 %b, i32 %c)
99
declare void @param8(i64, i64, i64, i64, i64, i64, i64, i64)
10+
declare i32 @param8_ret(i64, i64, i64, i64, i64, i64, i64, i64)
1011

1112

1213
define void @test() minsize nounwind {
@@ -74,3 +75,13 @@ define void @test_linux64(i32 %size) minsize nounwind {
7475
call void @param8(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8)
7576
ret void
7677
}
78+
79+
define i32 @test_linux64_i32(i32 %size) minsize nounwind {
80+
; LINUX64-LABEL: test_linux64_i32:
81+
; LINUX64: callq param8_ret
82+
; LINUX64-NOT: popq %rax
83+
; LINUX64: retq
84+
%a = alloca i64, i32 %size, align 8
85+
%r = call i32 @param8_ret(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8)
86+
ret i32 %r
87+
}

0 commit comments

Comments
 (0)