[PATCH] D18029: [X86] Correctly select registers to pop into for x86_64
Michael Kuperstein via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 9 23:56:23 PST 2016
mkuper created this revision.
mkuper added reviewers: rnk, hans.
mkuper added a subscriber: llvm-commits.
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.
http://reviews.llvm.org/D18029
Files:
lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/pop-stack-cleanup.ll
Index: test/CodeGen/X86/pop-stack-cleanup.ll
===================================================================
--- test/CodeGen/X86/pop-stack-cleanup.ll
+++ test/CodeGen/X86/pop-stack-cleanup.ll
@@ -7,6 +7,7 @@
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,12 @@
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
+; LINUX64-NOT: popq %rax
+ %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
+}
Index: lib/Target/X86/X86FrameLowering.cpp
===================================================================
--- lib/Target/X86/X86FrameLowering.cpp
+++ lib/Target/X86/X86FrameLowering.cpp
@@ -2447,7 +2447,8 @@
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;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18029.50242.patch
Type: text/x-patch
Size: 1424 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160310/dbb1d3c8/attachment.bin>
More information about the llvm-commits
mailing list