| ; 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 tailcallee_hidden | |
| 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 |