| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --version 5 |
| ; RUN: opt -p mergefunc -S %s | FileCheck %s |
| |
| define void @caller_of_callers(ptr %p) { |
| call void @weak_odr_caller_of_foo_1(ptr %p) |
| call void @weak_odr_caller_of_foo_2(ptr %p) |
| call void @weak_odr_caller_of_foo_3(ptr %p) |
| |
| call void @internal_caller_of_bar_1(ptr %p) |
| call void @weak_odr_caller_of_bar_2(ptr %p) |
| call void @weak_odr_caller_of_bar_3(ptr %p) |
| |
| call void @hidden_caller_of_zar_1(ptr %p) |
| call void @weak_odr_caller_of_zar_2(ptr %p) |
| |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_foo_1(ptr %p) { |
| entry: |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_foo_2(ptr %p) { |
| entry: |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_foo_3(ptr %p) { |
| entry: |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| tail call void @foo(ptr %p) |
| ret void |
| } |
| |
| declare void @foo(ptr) |
| |
| define internal void @internal_caller_of_bar_1(ptr %p) { |
| entry: |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_bar_2(ptr %p) { |
| entry: |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_bar_3(ptr %p) { |
| entry: |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| tail call void @bar(ptr %p) |
| ret void |
| } |
| |
| declare void @bar(ptr) |
| |
| define hidden void @hidden_caller_of_zar_1(ptr %p) { |
| entry: |
| tail call void @zar(ptr %p) |
| tail call void @zar(ptr %p) |
| tail call void @zar(ptr %p) |
| ret void |
| } |
| |
| define weak_odr hidden void @weak_odr_caller_of_zar_2(ptr %p) { |
| entry: |
| tail call void @zar(ptr %p) |
| tail call void @zar(ptr %p) |
| tail call void @zar(ptr %p) |
| ret void |
| } |
| |
| declare void @zar(ptr) |
| ; CHECK-LABEL: define void @caller_of_callers( |
| ; CHECK-SAME: ptr [[P:%.*]]) { |
| ; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]]) |
| ; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]]) |
| ; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]]) |
| ; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]]) |
| ; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]]) |
| ; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]]) |
| ; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]]) |
| ; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define private void @0( |
| ; CHECK-SAME: ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: tail call void @foo(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @foo(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @foo(ptr [[P]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define internal void @internal_caller_of_bar_1( |
| ; CHECK-SAME: ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: tail call void @bar(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @bar(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @bar(ptr [[P]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define hidden void @hidden_caller_of_zar_1( |
| ; CHECK-SAME: ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: tail call void @zar(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @zar(ptr [[P]]) |
| ; CHECK-NEXT: tail call void @zar(ptr [[P]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_2( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_1( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_3( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_bar_2( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @internal_caller_of_bar_1(ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_bar_3( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @internal_caller_of_bar_1(ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; |
| ; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_zar_2( |
| ; CHECK-SAME: ptr [[TMP0:%.*]]) { |
| ; CHECK-NEXT: tail call void @hidden_caller_of_zar_1(ptr [[TMP0]]) |
| ; CHECK-NEXT: ret void |
| ; |