diff options
Diffstat (limited to 'test/CodeGen/X86/hipe-cc64.ll')
| -rw-r--r-- | test/CodeGen/X86/hipe-cc64.ll | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/test/CodeGen/X86/hipe-cc64.ll b/test/CodeGen/X86/hipe-cc64.ll index 28d90399d857..43e2e1409fde 100644 --- a/test/CodeGen/X86/hipe-cc64.ll +++ b/test/CodeGen/X86/hipe-cc64.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -tailcallopt -code-model=medium -stack-alignment=8 -mtriple=x86_64-linux-gnu -mcpu=opteron | FileCheck %s +; RUN: llc < %s -stack-symbol-ordering=0 -tailcallopt -code-model=medium -stack-alignment=8 -mtriple=x86_64-linux-gnu -mcpu=opteron | FileCheck %s ; Check the HiPE calling convention works (x86-64) @@ -83,5 +83,24 @@ define cc 11 void @baz() nounwind { ret void } +; Sanity-check the tail call sequence. Number of arguments was chosen as to +; expose a bug where the tail call sequence clobbered the stack. +define cc 11 { i64, i64, i64 } @tailcaller(i64 %hp, i64 %p) #0 { + ; CHECK: movl $15, %esi + ; CHECK-NEXT: movl $31, %edx + ; CHECK-NEXT: movl $47, %ecx + ; CHECK-NEXT: movl $63, %r8d + ; CHECK-NEXT: popq %rax + ; CHECK-NEXT: jmp tailcallee + %ret = tail call cc11 { i64, i64, i64 } @tailcallee(i64 %hp, i64 %p, i64 15, + i64 31, i64 47, i64 63, i64 79) #1 + ret { i64, i64, i64 } %ret +} + +!hipe.literals = !{ !0, !1, !2 } +!0 = !{ !"P_NSP_LIMIT", i32 160 } +!1 = !{ !"X86_LEAF_WORDS", i32 24 } +!2 = !{ !"AMD64_LEAF_WORDS", i32 24 } @clos = external constant i64 declare cc 11 void @bar(i64, i64, i64, i64, i64, i64) +declare cc 11 { i64, i64, i64 } @tailcallee(i64, i64, i64, i64, i64, i64, i64) |
