]> granicus.if.org Git - llvm/commitdiff
[X86] for split stack, not save/restore nested arg if unused
authorThan McIntosh <thanm@google.com>
Fri, 19 Jul 2019 12:54:44 +0000 (12:54 +0000)
committerThan McIntosh <thanm@google.com>
Fri, 19 Jul 2019 12:54:44 +0000 (12:54 +0000)
Summary:
For split-stack, if the nested argument (i.e. R10) is not used, no need to save/restore it in the prologue.

Reviewers: thanm

Reviewed By: thanm

Subscribers: mstorsjo, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D64673

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366569 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/segmented-stacks.ll

index e310fe0691171b130975cc76191f72b4e73073b8..1fb6eb33872eb498138f9cbb0fbb783f7231406d 100644 (file)
@@ -2212,7 +2212,7 @@ HasNestArgument(const MachineFunction *MF) {
   const Function &F = MF->getFunction();
   for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end();
        I != E; I++) {
-    if (I->hasNestAttr())
+    if (I->hasNestAttr() && !I->use_empty())
       return true;
   }
   return false;
index fac9a33394bcd0d1e763f1476d2284778b59e93f..c4539f7b12557dec5733fe390a7088903f0c7e22 100644 (file)
@@ -611,7 +611,7 @@ define void @test_nostack() #0 {
 ; X32-Linux-NOT:   calll __morestack
 
 ; X64-Linux-LABEL: test_nostack:
-; X32-Linux-NOT:   callq __morestack
+; X64-Linux-NOT:   callq __morestack
 
 ; X32ABI-LABEL: test_nostack:
 ; X32ABI-NOT:   callq __morestack
@@ -688,6 +688,45 @@ define i32 @test_sibling_call_empty_frame(i32 %x) #0 {
 
 }
 
+; Test that unused nested argument doesn't need saving/restoring.
+
+define i32 @test_nested_unused(i32 * nest %unused) #0 {
+       %mem = alloca i32, i32 10
+       call void @dummy_use (i32* %mem, i32 10)
+       ret i32 123
+
+; X64-Linux-LABEL: test_nested_unused:
+; X64-Linux-NOT:   movq %r10, %rax
+; X64-Linux:       callq __morestack
+; X64-Linux-NOT:   movq %rax, %r10
+
+; X64-Darwin-LABEL: test_nested_unused:
+; X64-Darwin-NOT:   movq %r10, %rax
+; X64-Darwin:       callq ___morestack
+; X64-Darwin-NOT:   movq %rax, %r10
+
+; X64-FreeBSD-LABEL: test_nested_unused:
+; X64-FreeBSD-NOT:   movq %r10, %rax
+; X64-FreeBSD:       callq __morestack
+; X64-FreeBSD-NOT:   movq %rax, %r10
+
+; X64-DFlyBSD-LABEL: test_nested_unused:
+; X64-DFlyBSD-NOT:   movq %r10, %rax
+; X64-DFlyBSD:       callq __morestack
+; X64-DFlyBSD-NOT:   movq %rax, %r10
+
+; X64-MinGW-LABEL: test_nested_unused:
+; X64-MinGW-NOT:   movq %r10, %rax
+; X64-MinGW:       callq __morestack
+; X64-MinGW-NOT:   movq %rax, %r10
+
+; X32ABI-LABEL: test_nested_unused:
+; X32ABI-NOT:   movl %r10d, %eax
+; X32ABI:       callq __morestack
+; X32ABI-NOT:   movq %rax, %r10
+
+}
+
 attributes #0 = { "split-stack" }
 
 ; X64-Linux-Large: .rodata