[X86] Add sibling-call test cases
authorAleksandr Urakov <aleksandr.urakov@jetbrains.com>
Wed, 15 Aug 2018 10:54:06 +0000 (10:54 +0000)
committerAleksandr Urakov <aleksandr.urakov@jetbrains.com>
Wed, 15 Aug 2018 10:54:06 +0000 (10:54 +0000)
This commit adds new sibling-call test cases, so it will be possible to see
how these test cases will be changed after applying D45653.
See D45653 for details.

llvm-svn: 339760

llvm/test/CodeGen/X86/sibcall.ll

index d8c3f1c..1a93ba1 100644 (file)
@@ -606,3 +606,112 @@ entry:
 }
 
 declare fastcc double @foo20(double) nounwind
+
+; bug 28417
+define fastcc void @t21_sret_to_sret(%struct.foo* noalias sret %agg.result) nounwind  {
+; 32-LABEL: t21_sret_to_sret:
+; 32: jmp {{_?}}t21_f_sret
+; 64-LABEL: t21_sret_to_sret:
+; 64: jmp {{_?}}t21_f_sret
+; X32-LABEL: t21_sret_to_sret:
+; X32:       # %bb.0:
+; X32-NEXT:    pushl %esi
+; X32-NEXT:    subl $8, %esp
+; X32-NEXT:    movl %ecx, %esi
+; X32-NEXT:    calll t21_f_sret
+; X32-NEXT:    movl %esi, %eax
+; X32-NEXT:    addl $8, %esp
+; X32-NEXT:    popl %esi
+; X32-NEXT:    retl
+;
+; X64-LABEL: t21_sret_to_sret:
+; X64:       # %bb.0:
+; X64-NEXT:    pushq %rbx
+; X64-NEXT:    movq %rdi, %rbx
+; X64-NEXT:    callq t21_f_sret
+; X64-NEXT:    movq %rbx, %rax
+; X64-NEXT:    popq %rbx
+; X64-NEXT:    retq
+;
+; X32ABI-LABEL: t21_sret_to_sret:
+; X32ABI:       # %bb.0:
+; X32ABI-NEXT:    pushq %rbx
+; X32ABI-NEXT:    movl %edi, %ebx
+; X32ABI-NEXT:    callq t21_f_sret
+; X32ABI-NEXT:    movl %ebx, %eax
+; X32ABI-NEXT:    popq %rbx
+; X32ABI-NEXT:    retq
+  tail call fastcc void @t21_f_sret(%struct.foo* noalias sret %agg.result) nounwind
+  ret void
+}
+
+define fastcc void @t21_sret_to_non_sret(%struct.foo* noalias sret %agg.result) nounwind  {
+; 32-LABEL: t21_sret_to_non_sret:
+; 32: calll {{_?}}t21_f_non_sret
+; 32: retl
+; 64-LABEL: t21_sret_to_non_sret:
+; 64: callq {{_?}}t21_f_non_sret
+; 64: retq
+; X32-LABEL: t21_sret_to_non_sret:
+; X32:       # %bb.0:
+; X32-NEXT:    pushl %esi
+; X32-NEXT:    subl $8, %esp
+; X32-NEXT:    movl %ecx, %esi
+; X32-NEXT:    calll t21_f_non_sret
+; X32-NEXT:    movl %esi, %eax
+; X32-NEXT:    addl $8, %esp
+; X32-NEXT:    popl %esi
+; X32-NEXT:    retl
+;
+; X64-LABEL: t21_sret_to_non_sret:
+; X64:       # %bb.0:
+; X64-NEXT:    pushq %rbx
+; X64-NEXT:    movq %rdi, %rbx
+; X64-NEXT:    callq t21_f_non_sret
+; X64-NEXT:    movq %rbx, %rax
+; X64-NEXT:    popq %rbx
+; X64-NEXT:    retq
+;
+; X32ABI-LABEL: t21_sret_to_non_sret:
+; X32ABI:       # %bb.0:
+; X32ABI-NEXT:    pushq %rbx
+; X32ABI-NEXT:    movl %edi, %ebx
+; X32ABI-NEXT:    callq t21_f_non_sret
+; X32ABI-NEXT:    movl %ebx, %eax
+; X32ABI-NEXT:    popq %rbx
+; X32ABI-NEXT:    retq
+  tail call fastcc void @t21_f_non_sret(%struct.foo* %agg.result) nounwind
+  ret void
+}
+
+define fastcc void @t21_non_sret_to_sret(%struct.foo* %agg.result) nounwind  {
+; 32-LABEL: t21_non_sret_to_sret:
+; 32: jmp {{_?}}t21_f_sret
+; 64-LABEL: t21_non_sret_to_sret:
+; 64: jmp {{_?}}t21_f_sret
+; X32-LABEL: t21_non_sret_to_sret:
+; X32:       # %bb.0:
+; X32-NEXT:    subl $12, %esp
+; X32-NEXT:    calll t21_f_sret
+; X32-NEXT:    addl $12, %esp
+; X32-NEXT:    retl
+;
+; X64-LABEL: t21_non_sret_to_sret:
+; X64:       # %bb.0:
+; X64-NEXT:    pushq %rax
+; X64-NEXT:    callq t21_f_sret
+; X64-NEXT:    popq %rax
+; X64-NEXT:    retq
+;
+; X32ABI-LABEL: t21_non_sret_to_sret:
+; X32ABI:       # %bb.0:
+; X32ABI-NEXT:    pushq %rax
+; X32ABI-NEXT:    callq t21_f_sret
+; X32ABI-NEXT:    popq %rax
+; X32ABI-NEXT:    retq
+  tail call fastcc void @t21_f_sret(%struct.foo* noalias sret %agg.result) nounwind
+  ret void
+}
+
+declare fastcc void @t21_f_sret(%struct.foo* noalias sret) nounwind
+declare fastcc void @t21_f_non_sret(%struct.foo*) nounwind