brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 568f4fe Raw
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