|  | ; 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 --implicit-check-not=linkonce_odr_caller_of_foo_2 --implicit-check-not=linkonce_odr_caller_of_foo_1 %s | 
|  |  | 
|  | define void @caller_of_callers(ptr %p) { | 
|  | call void @linkonce_odr_caller_of_foo_1(ptr %p) | 
|  | call void @linkonce_odr_caller_of_foo_2(ptr %p) | 
|  | call void @linkonce_odr_caller_of_foo_3(ptr %p) | 
|  |  | 
|  | call void @internal_caller_of_bar_1(ptr %p) | 
|  | call void @linkonce_odr_caller_of_bar_2(ptr %p) | 
|  | call void @linkonce_odr_caller_of_bar_3(ptr %p) | 
|  |  | 
|  | call void @hidden_caller_of_zar_1(ptr %p) | 
|  | call void @linkonce_odr_caller_of_zar_2(ptr %p) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define linkonce_odr hidden void @linkonce_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 linkonce_odr hidden void @linkonce_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 linkonce_odr hidden void @linkonce_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 linkonce_odr hidden void @linkonce_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 linkonce_odr hidden void @linkonce_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 linkonce_odr hidden void @linkonce_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 | 
|  | ; |