1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
llvm-mirror/test/CodeGen/X86/tailcallpic3.ll
Fangrui Song 3a5d1f8cce [X86][ELF] Prefer to lower MC_GlobalAddress operands to .Lfoo$local
For a MC_GlobalAddress reference to a dso_local external GlobalValue with a definition, emit .Lfoo$local to avoid a relocation.

-fno-pic and -fpie can infer dso_local but -fpic cannot.  In the future,
we can explore the possibility of inferring dso_local with -fpic. As the
description of D73228 says, LLVM's existing IPO optimization behaviors
(like -fno-semantic-interposition) and a previous assembly behavior give
us enough license to be aggressive here.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D73230
2020-01-30 17:52:35 -08:00

74 lines
1.4 KiB
LLVM

; RUN: llc < %s -mtriple=i686-pc-linux-gnu -relocation-model=pic | FileCheck %s
; While many of these could be tail called, we don't do it because it forces
; early binding.
declare void @external()
define hidden void @tailcallee_hidden() {
entry:
ret void
}
define void @tailcall_hidden() {
entry:
tail call void @tailcallee_hidden()
ret void
}
; CHECK: tailcall_hidden:
; CHECK: jmp .Ltailcallee_hidden$local
define internal void @tailcallee_internal() {
entry:
ret void
}
define void @tailcall_internal() {
entry:
tail call void @tailcallee_internal()
ret void
}
; CHECK: tailcall_internal:
; CHECK: jmp tailcallee_internal
define default void @tailcallee_default() {
entry:
ret void
}
define void @tailcall_default() {
entry:
tail call void @tailcallee_default()
ret void
}
; CHECK: tailcall_default:
; CHECK: calll tailcallee_default@PLT
define void @tailcallee_default_implicit() {
entry:
ret void
}
define void @tailcall_default_implicit() {
entry:
tail call void @tailcallee_default_implicit()
ret void
}
; CHECK: tailcall_default_implicit:
; CHECK: calll tailcallee_default_implicit@PLT
define void @tailcall_external() {
tail call void @external()
ret void
}
; CHECK: tailcall_external:
; CHECK: calll external@PLT
define void @musttail_external() {
musttail call void @external()
ret void
}
; CHECK: musttail_external:
; CHECK: movl external@GOT
; CHECK: jmpl