49 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -mtriple=x86_64-unknown-windows-gnu < %s | FileCheck %s3 4; Check calling convention is correct for win64 when doing a tailcall5; for a pointer loaded from memory.6 7declare void @foo(i64, ptr)8 9define void @do_tailcall(ptr %objp) nounwind {10; CHECK-LABEL: do_tailcall:11; CHECK: # %bb.0:12; CHECK-NEXT: pushq %rsi13; CHECK-NEXT: subq $32, %rsp14; CHECK-NEXT: movq %rcx, %rsi15; CHECK-NEXT: xorl %ecx, %ecx16; CHECK-NEXT: xorl %edx, %edx17; CHECK-NEXT: callq foo18; CHECK-NEXT: xorl %ecx, %ecx19; CHECK-NEXT: movq %rsi, %rax20; CHECK-NEXT: addq $32, %rsp21; CHECK-NEXT: popq %rsi22; CHECK-NEXT: rex64 jmpq *(%rax) # TAILCALL23 tail call void @foo(i64 0, ptr null)24 %fptr = load ptr, ptr %objp, align 825 tail call void %fptr(ptr null)26 ret void27}28 29; Make sure aliases of ccc are also treated as win64 functions30define fastcc void @do_tailcall_fastcc(ptr %objp) nounwind {31; CHECK-LABEL: do_tailcall_fastcc:32; CHECK: # %bb.0:33; CHECK-NEXT: pushq %rsi34; CHECK-NEXT: subq $32, %rsp35; CHECK-NEXT: movq %rcx, %rsi36; CHECK-NEXT: xorl %ecx, %ecx37; CHECK-NEXT: xorl %edx, %edx38; CHECK-NEXT: callq foo39; CHECK-NEXT: xorl %ecx, %ecx40; CHECK-NEXT: movq %rsi, %rax41; CHECK-NEXT: addq $32, %rsp42; CHECK-NEXT: popq %rsi43; CHECK-NEXT: rex64 jmpq *(%rax) # TAILCALL44 tail call void @foo(i64 0, ptr null)45 %fptr = load ptr, ptr %objp, align 846 tail call fastcc void %fptr(ptr null)47 ret void48}49