| ; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s |
| |
| declare win64cc void @win64_callee(i32) |
| declare win64cc void (i32)* @win64_indirect() |
| declare win64cc void @win64_other(i32) |
| declare void @sysv_callee(i32) |
| declare void (i32)* @sysv_indirect() |
| declare void @sysv_other(i32) |
| |
| define void @sysv_caller(i32 %p1) { |
| entry: |
| tail call win64cc void @win64_callee(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: sysv_caller: |
| ; CHECK: subq $40, %rsp |
| ; CHECK: callq win64_callee |
| ; CHECK: addq $40, %rsp |
| ; CHECK: retq |
| |
| define win64cc void @win64_caller(i32 %p1) { |
| entry: |
| tail call void @sysv_callee(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: win64_caller: |
| ; CHECK: callq sysv_callee |
| ; CHECK: retq |
| |
| define void @sysv_matched(i32 %p1) { |
| tail call void @sysv_callee(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: sysv_matched: |
| ; CHECK: jmp sysv_callee # TAILCALL |
| |
| define win64cc void @win64_matched(i32 %p1) { |
| tail call win64cc void @win64_callee(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: win64_matched: |
| ; CHECK: jmp win64_callee # TAILCALL |
| |
| define win64cc void @win64_indirect_caller(i32 %p1) { |
| %1 = call win64cc void (i32)* @win64_indirect() |
| call win64cc void @win64_other(i32 0) |
| tail call win64cc void %1(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: win64_indirect_caller: |
| ; CHECK: jmpq *%{{rax|rcx|rdx|r8|r9|r11}} # TAILCALL |
| |
| define void @sysv_indirect_caller(i32 %p1) { |
| %1 = call void (i32)* @sysv_indirect() |
| call void @sysv_other(i32 0) |
| tail call void %1(i32 %p1) |
| ret void |
| } |
| |
| ; CHECK-LABEL: sysv_indirect_caller: |
| ; CHECK: jmpq *%{{rax|rcx|rdx|rsi|rdi|r8|r9|r11}} # TAILCALL |