| ; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s --check-prefix=CHECK | |
| ; RUN: llc --fast-isel -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s --check-prefix=CHECK | |
| ; RUN: llc --global-isel --global-isel-abort=2 -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s --check-prefix=CHECK | |
| define dso_local void @normal_call(ptr noundef readonly %func_ptr) local_unnamed_addr section "nc_sect" { | |
| entry: | |
| call void @a() | |
| call void @a() | |
| call void %func_ptr() | |
| ret void | |
| } | |
| ; CHECK-LABEL: normal_call: | |
| ; CHECK: .Limpcall0: | |
| ; CHECK-NEXT: rex64 | |
| ; CHECK-NEXT: callq __imp_a | |
| ; CHECK-NEXT: nopl 8(%rax,%rax) | |
| ; CHECK-NEXT: .Limpcall1: | |
| ; CHECK-NEXT: rex64 | |
| ; CHECK-NEXT: callq __imp_a | |
| ; CHECK-NEXT: nopl 8(%rax,%rax) | |
| ; CHECK-NEXT: movq %rsi, %rax | |
| ; CHECK-NEXT: .Limpcall2: | |
| ; CHECK-NEXT: callq *%rax | |
| ; CHECK-NEXT: nopl (%rax) | |
| ; CHECK-NEXT: nop | |
| define dso_local void @tail_call() local_unnamed_addr section "tc_sect" { | |
| entry: | |
| tail call void @b() | |
| ret void | |
| } | |
| ; CHECK-LABEL: tail_call: | |
| ; CHECK: .Limpcall3: | |
| ; CHECK-NEXT: jmp __imp_b | |
| define dso_local void @tail_call_fp(ptr noundef readonly %func_ptr) local_unnamed_addr section "tc_sect" { | |
| entry: | |
| tail call void %func_ptr() | |
| ret void | |
| } | |
| ; CHECK-LABEL: tail_call_fp: | |
| ; CHECK: movq %rcx, %rax | |
| ; CHECK-NEXT: .Limpcall4: | |
| ; CHECK-NEXT: rex64 jmpq *%rax | |
| declare dllimport void @a() local_unnamed_addr | |
| declare dllimport void @b() local_unnamed_addr | |
| ; CHECK-LABEL .section .retplne,"yi" | |
| ; CHECK-NEXT .asciz "RetpolineV1" | |
| ; CHECK-NEXT .long 24 | |
| ; CHECK-NEXT .secnum tc_sect | |
| ; CHECK-NEXT .long 3 | |
| ; CHECK-NEXT .secoffset .Limpcall3 | |
| ; CHECK-NEXT .long 5 | |
| ; CHECK-NEXT .secoffset .Limpcall4 | |
| ; CHECK-NEXT .long 32 | |
| ; CHECK-NEXT .secnum nc_sect | |
| ; CHECK-NEXT .long 3 | |
| ; CHECK-NEXT .secoffset .Limpcall0 | |
| ; CHECK-NEXT .long 3 | |
| ; CHECK-NEXT .secoffset .Limpcall1 | |
| ; CHECK-NEXT .long 5 | |
| ; CHECK-NEXT .secoffset .Limpcall2 | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"import-call-optimization", i32 1} |