Skip to content

Commit dad2026

Browse files
committed
!fixup
1 parent 6d33732 commit dad2026

File tree

7 files changed

+98
-83
lines changed

7 files changed

+98
-83
lines changed

llvm/lib/Transforms/IPO/MergeFunctions.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -889,16 +889,19 @@ bool MergeFunctions::writeThunkOrAlias(Function *F, Function *G) {
889889
return false;
890890
}
891891

892+
/// Returns true if \p F is either weak_odr or linkonce_odr.
893+
static bool isODR(const Function *F) {
894+
return F->hasWeakODRLinkage() || F->hasLinkOnceODRLinkage();
895+
}
896+
892897
// Merge two equivalent functions. Upon completion, Function G is deleted.
893898
void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
894899

895900
// Create a new thunk that both F and G can call, if F cannot call G directly.
896901
// That is the case if F is either interposable or if G is either weak_odr or
897902
// linkonce_odr.
898-
if (F->isInterposable() || G->hasWeakODRLinkage() ||
899-
G->hasLinkOnceODRLinkage()) {
900-
assert(G->isInterposable() || G->hasWeakODRLinkage() ||
901-
G->hasLinkOnceODRLinkage());
903+
if (F->isInterposable() || (isODR(F) && isODR(G))) {
904+
assert((!isODR(G) || isODR(F)) && "if G is ODR, F must also be ODR due to ordering");
902905

903906
// Both writeThunkOrAlias() calls below must succeed, either because we can
904907
// create aliases for G and NewF, or because a thunk for F is profitable.
@@ -917,8 +920,16 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
917920
copyMetadataIfPresent(F, NewF, "type");
918921
copyMetadataIfPresent(F, NewF, "kcfi_type");
919922
removeUsers(F);
923+
920924
F->replaceAllUsesWith(NewF);
921925

926+
// If G or NewF are (weak|linkonce)_odr, update all callers to call the
927+
// thunk.
928+
if (isODR(G))
929+
replaceDirectCallers(G, F);
930+
if (isODR(F))
931+
replaceDirectCallers(NewF, F);
932+
922933
// We collect alignment before writeThunkOrAlias that overwrites NewF and
923934
// G's content.
924935
const MaybeAlign NewFAlign = NewF->getAlign();
@@ -992,19 +1003,18 @@ void MergeFunctions::replaceFunctionInTree(const FunctionNode &FN,
9921003

9931004
// Ordering for functions that are equal under FunctionComparator
9941005
static bool isFuncOrderCorrect(const Function *F, const Function *G) {
1006+
if (isODR(F) != isODR(G)) {
1007+
// ODR functions before non-ODR functions. A ODR function can call a non-ODR
1008+
// function if it is not interposable, but not the other way around.
1009+
return isODR(G);
1010+
}
1011+
9951012
if (F->isInterposable() != G->isInterposable()) {
9961013
// Strong before weak, because the weak function may call the strong
9971014
// one, but not the other way around.
9981015
return !F->isInterposable();
9991016
}
10001017

1001-
if (F->hasWeakODRLinkage() != G->hasWeakODRLinkage() ||
1002-
F->hasLinkOnceODRLinkage() != G->hasLinkOnceODRLinkage()) {
1003-
// ODR functions before non-ODR functions. A ODR function can call a non-ODR
1004-
// function if it is not interposable, but not the other way around.
1005-
return F->hasWeakODRLinkage() || F->hasLinkOnceODRLinkage();
1006-
}
1007-
10081018
if (F->hasLocalLinkage() != G->hasLocalLinkage()) {
10091019
// External before local, because we definitely have to keep the external
10101020
// function, but may be able to drop the local one.

llvm/test/Transforms/MergeFunc/linkonce_odr.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
; The problem with this is that the linker could then choose these two stubs
88
; each of the two modules and we end up with two stubs calling each other.
99

10-
11-
1210
define linkonce_odr i32 @funC(i32 %x, i32 %y) {
1311
%sum = add i32 %x, %y
1412
%sum2 = add i32 %x, %sum
@@ -37,7 +35,7 @@ define linkonce_odr i32 @funA(i32 %x, i32 %y) {
3735
;.
3836
; CHECK: @take_addr_of_funB = global ptr @funB
3937
;.
40-
; CHECK-LABEL: define linkonce_odr i32 @funA(
38+
; CHECK-LABEL: define private i32 @0(
4139
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
4240
; CHECK-NEXT: [[SUM:%.*]] = add i32 [[X]], [[Y]]
4341
; CHECK-NEXT: [[SUM2:%.*]] = add i32 [[X]], [[SUM]]
@@ -47,12 +45,12 @@ define linkonce_odr i32 @funA(i32 %x, i32 %y) {
4745
;
4846
; CHECK-LABEL: define linkonce_odr i32 @funC(
4947
; CHECK-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
50-
; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @funA(i32 [[TMP0]], i32 [[TMP1]])
48+
; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @[[GLOB0:[0-9]+]](i32 [[TMP0]], i32 [[TMP1]])
5149
; CHECK-NEXT: ret i32 [[TMP3]]
5250
;
5351
;
5452
; CHECK-LABEL: define linkonce_odr i32 @funB(
5553
; CHECK-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
56-
; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @funA(i32 [[TMP0]], i32 [[TMP1]])
54+
; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @[[GLOB0]](i32 [[TMP0]], i32 [[TMP1]])
5755
; CHECK-NEXT: ret i32 [[TMP3]]
5856
;

llvm/test/Transforms/MergeFunc/merge-linkonce-odr-used.ll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ declare void @foo(ptr)
4141
;.
4242
; CHECK-LABEL: define void @caller_of_callers(
4343
; CHECK-SAME: ptr [[P:%.*]]) {
44-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_1(ptr [[P]])
45-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_2(ptr [[P]])
46-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_3(ptr [[P]])
44+
; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]])
45+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
46+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
4747
; CHECK-NEXT: ret void
4848
;
4949
;
50-
; CHECK-LABEL: define linkonce_odr void @linkonce_odr_caller_of_foo_3(
50+
; CHECK-LABEL: define private void @0(
5151
; CHECK-SAME: ptr [[P:%.*]]) {
5252
; CHECK-NEXT: [[ENTRY:.*:]]
5353
; CHECK-NEXT: tail call void @foo(ptr [[P]])
@@ -58,12 +58,18 @@ declare void @foo(ptr)
5858
;
5959
; CHECK-LABEL: define linkonce_odr void @linkonce_odr_caller_of_foo_2(
6060
; CHECK-SAME: ptr [[TMP0:%.*]]) {
61-
; CHECK-NEXT: tail call void @linkonce_odr_caller_of_foo_3(ptr [[TMP0]])
61+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6262
; CHECK-NEXT: ret void
6363
;
6464
;
6565
; CHECK-LABEL: define linkonce_odr void @linkonce_odr_caller_of_foo_1(
6666
; CHECK-SAME: ptr [[TMP0:%.*]]) {
67-
; CHECK-NEXT: tail call void @linkonce_odr_caller_of_foo_3(ptr [[TMP0]])
67+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
68+
; CHECK-NEXT: ret void
69+
;
70+
;
71+
; CHECK-LABEL: define linkonce_odr void @linkonce_odr_caller_of_foo_3(
72+
; CHECK-SAME: ptr [[TMP0:%.*]]) {
73+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6874
; CHECK-NEXT: ret void
6975
;

llvm/test/Transforms/MergeFunc/merge-linkonce-odr-weak-odr-mixed-used.ll

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ declare void @foo(ptr)
4141
;.
4242
; CHECK-LABEL: define void @caller_of_callers(
4343
; CHECK-SAME: ptr [[P:%.*]]) {
44-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_1(ptr [[P]])
45-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_2(ptr [[P]])
46-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_3(ptr [[P]])
44+
; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]])
45+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
46+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
4747
; CHECK-NEXT: ret void
4848
;
4949
;
50-
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_3(
50+
; CHECK-LABEL: define private void @0(
5151
; CHECK-SAME: ptr [[P:%.*]]) {
5252
; CHECK-NEXT: [[ENTRY:.*:]]
5353
; CHECK-NEXT: tail call void @foo(ptr [[P]])
@@ -56,14 +56,20 @@ declare void @foo(ptr)
5656
; CHECK-NEXT: ret void
5757
;
5858
;
59+
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_1(
60+
; CHECK-SAME: ptr [[TMP0:%.*]]) {
61+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
62+
; CHECK-NEXT: ret void
63+
;
64+
;
5965
; CHECK-LABEL: define linkonce_odr void @linkonce_odr_caller_of_foo_2(
6066
; CHECK-SAME: ptr [[TMP0:%.*]]) {
61-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
67+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6268
; CHECK-NEXT: ret void
6369
;
6470
;
65-
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_1(
71+
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_3(
6672
; CHECK-SAME: ptr [[TMP0:%.*]]) {
67-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
73+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6874
; CHECK-NEXT: ret void
6975
;

llvm/test/Transforms/MergeFunc/merge-linkonce-odr.ll

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,21 @@ entry:
8585
}
8686

8787
declare void @zar(ptr)
88+
8889
; CHECK-LABEL: define void @caller_of_callers(
8990
; CHECK-SAME: ptr [[P:%.*]]) {
90-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_1(ptr [[P]])
91-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_2(ptr [[P]])
92-
; CHECK-NEXT: call void @linkonce_odr_caller_of_foo_3(ptr [[P]])
93-
; CHECK-NEXT: call void @linkonce_odr_caller_of_bar_2(ptr [[P]])
94-
; CHECK-NEXT: call void @linkonce_odr_caller_of_bar_2(ptr [[P]])
95-
; CHECK-NEXT: call void @linkonce_odr_caller_of_bar_3(ptr [[P]])
96-
; CHECK-NEXT: call void @linkonce_odr_caller_of_zar_2(ptr [[P]])
97-
; CHECK-NEXT: call void @linkonce_odr_caller_of_zar_2(ptr [[P]])
91+
; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]])
92+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
93+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
94+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
95+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
96+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
97+
; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]])
98+
; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]])
9899
; CHECK-NEXT: ret void
99100
;
100101
;
101-
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_foo_3(
102+
; CHECK-LABEL: define private void @0(
102103
; CHECK-SAME: ptr [[P:%.*]]) {
103104
; CHECK-NEXT: [[ENTRY:.*:]]
104105
; CHECK-NEXT: tail call void @foo(ptr [[P]])
@@ -107,7 +108,7 @@ declare void @zar(ptr)
107108
; CHECK-NEXT: ret void
108109
;
109110
;
110-
; CHECK-LABEL: define private void @0(
111+
; CHECK-LABEL: define internal void @internal_caller_of_bar_1(
111112
; CHECK-SAME: ptr [[P:%.*]]) {
112113
; CHECK-NEXT: [[ENTRY:.*:]]
113114
; CHECK-NEXT: tail call void @bar(ptr [[P]])
@@ -116,7 +117,7 @@ declare void @zar(ptr)
116117
; CHECK-NEXT: ret void
117118
;
118119
;
119-
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_zar_2(
120+
; CHECK-LABEL: define hidden void @hidden_caller_of_zar_1(
120121
; CHECK-SAME: ptr [[P:%.*]]) {
121122
; CHECK-NEXT: [[ENTRY:.*:]]
122123
; CHECK-NEXT: tail call void @zar(ptr [[P]])
@@ -127,30 +128,12 @@ declare void @zar(ptr)
127128
;
128129
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_foo_2(
129130
; CHECK-SAME: ptr [[TMP0:%.*]]) {
130-
; CHECK-NEXT: tail call void @linkonce_odr_caller_of_foo_3(ptr [[TMP0]])
131+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
131132
; CHECK-NEXT: ret void
132133
;
133134
;
134135
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_foo_1(
135136
; CHECK-SAME: ptr [[TMP0:%.*]]) {
136-
; CHECK-NEXT: tail call void @linkonce_odr_caller_of_foo_3(ptr [[TMP0]])
137-
; CHECK-NEXT: ret void
138-
;
139-
;
140-
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_bar_3(
141-
; CHECK-SAME: ptr [[TMP0:%.*]]) {
142-
; CHECK-NEXT: tail call void @[[GLOB0:[0-9]+]](ptr [[TMP0]])
143-
; CHECK-NEXT: ret void
144-
;
145-
;
146-
; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_bar_2(
147-
; CHECK-SAME: ptr [[TMP0:%.*]]) {
148137
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
149138
; CHECK-NEXT: ret void
150139
;
151-
;
152-
; CHECK-LABEL: define hidden void @hidden_caller_of_zar_1(
153-
; CHECK-SAME: ptr [[TMP0:%.*]]) {
154-
; CHECK-NEXT: tail call void @linkonce_odr_caller_of_zar_2(ptr [[TMP0]])
155-
; CHECK-NEXT: ret void
156-
;

llvm/test/Transforms/MergeFunc/merge-weak-odr-used.ll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ declare void @foo(ptr)
4141
;.
4242
; CHECK-LABEL: define void @caller_of_callers(
4343
; CHECK-SAME: ptr [[P:%.*]]) {
44-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_1(ptr [[P]])
45-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_2(ptr [[P]])
46-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_3(ptr [[P]])
44+
; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]])
45+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
46+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
4747
; CHECK-NEXT: ret void
4848
;
4949
;
50-
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_3(
50+
; CHECK-LABEL: define private void @0(
5151
; CHECK-SAME: ptr [[P:%.*]]) {
5252
; CHECK-NEXT: [[ENTRY:.*:]]
5353
; CHECK-NEXT: tail call void @foo(ptr [[P]])
@@ -58,12 +58,18 @@ declare void @foo(ptr)
5858
;
5959
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_2(
6060
; CHECK-SAME: ptr [[TMP0:%.*]]) {
61-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
61+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6262
; CHECK-NEXT: ret void
6363
;
6464
;
6565
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_1(
6666
; CHECK-SAME: ptr [[TMP0:%.*]]) {
67-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
67+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
68+
; CHECK-NEXT: ret void
69+
;
70+
;
71+
; CHECK-LABEL: define weak_odr void @weak_odr_caller_of_foo_3(
72+
; CHECK-SAME: ptr [[TMP0:%.*]]) {
73+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
6874
; CHECK-NEXT: ret void
6975
;

llvm/test/Transforms/MergeFunc/merge-weak-odr.ll

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,18 @@ entry:
8787
declare void @zar(ptr)
8888
; CHECK-LABEL: define void @caller_of_callers(
8989
; CHECK-SAME: ptr [[P:%.*]]) {
90-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_1(ptr [[P]])
91-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_2(ptr [[P]])
92-
; CHECK-NEXT: call void @weak_odr_caller_of_foo_3(ptr [[P]])
93-
; CHECK-NEXT: call void @weak_odr_caller_of_bar_2(ptr [[P]])
94-
; CHECK-NEXT: call void @weak_odr_caller_of_bar_2(ptr [[P]])
95-
; CHECK-NEXT: call void @weak_odr_caller_of_bar_3(ptr [[P]])
96-
; CHECK-NEXT: call void @weak_odr_caller_of_zar_2(ptr [[P]])
97-
; CHECK-NEXT: call void @weak_odr_caller_of_zar_2(ptr [[P]])
90+
; CHECK-NEXT: call void @[[GLOB0:[0-9]+]](ptr [[P]])
91+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
92+
; CHECK-NEXT: call void @[[GLOB0]](ptr [[P]])
93+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
94+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
95+
; CHECK-NEXT: call void @internal_caller_of_bar_1(ptr [[P]])
96+
; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]])
97+
; CHECK-NEXT: call void @hidden_caller_of_zar_1(ptr [[P]])
9898
; CHECK-NEXT: ret void
9999
;
100100
;
101-
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_3(
101+
; CHECK-LABEL: define private void @0(
102102
; CHECK-SAME: ptr [[P:%.*]]) {
103103
; CHECK-NEXT: [[ENTRY:.*:]]
104104
; CHECK-NEXT: tail call void @foo(ptr [[P]])
@@ -107,7 +107,7 @@ declare void @zar(ptr)
107107
; CHECK-NEXT: ret void
108108
;
109109
;
110-
; CHECK-LABEL: define private void @0(
110+
; CHECK-LABEL: define internal void @internal_caller_of_bar_1(
111111
; CHECK-SAME: ptr [[P:%.*]]) {
112112
; CHECK-NEXT: [[ENTRY:.*:]]
113113
; CHECK-NEXT: tail call void @bar(ptr [[P]])
@@ -116,7 +116,7 @@ declare void @zar(ptr)
116116
; CHECK-NEXT: ret void
117117
;
118118
;
119-
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_zar_2(
119+
; CHECK-LABEL: define hidden void @hidden_caller_of_zar_1(
120120
; CHECK-SAME: ptr [[P:%.*]]) {
121121
; CHECK-NEXT: [[ENTRY:.*:]]
122122
; CHECK-NEXT: tail call void @zar(ptr [[P]])
@@ -127,30 +127,36 @@ declare void @zar(ptr)
127127
;
128128
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_2(
129129
; CHECK-SAME: ptr [[TMP0:%.*]]) {
130-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
130+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
131131
; CHECK-NEXT: ret void
132132
;
133133
;
134134
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_1(
135135
; CHECK-SAME: ptr [[TMP0:%.*]]) {
136-
; CHECK-NEXT: tail call void @weak_odr_caller_of_foo_3(ptr [[TMP0]])
136+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
137137
; CHECK-NEXT: ret void
138138
;
139139
;
140-
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_bar_3(
140+
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_foo_3(
141141
; CHECK-SAME: ptr [[TMP0:%.*]]) {
142-
; CHECK-NEXT: tail call void @[[GLOB0:[0-9]+]](ptr [[TMP0]])
142+
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
143143
; CHECK-NEXT: ret void
144144
;
145145
;
146146
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_bar_2(
147147
; CHECK-SAME: ptr [[TMP0:%.*]]) {
148-
; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
148+
; CHECK-NEXT: tail call void @internal_caller_of_bar_1(ptr [[TMP0]])
149149
; CHECK-NEXT: ret void
150150
;
151151
;
152-
; CHECK-LABEL: define hidden void @hidden_caller_of_zar_1(
152+
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_bar_3(
153+
; CHECK-SAME: ptr [[TMP0:%.*]]) {
154+
; CHECK-NEXT: tail call void @internal_caller_of_bar_1(ptr [[TMP0]])
155+
; CHECK-NEXT: ret void
156+
;
157+
;
158+
; CHECK-LABEL: define weak_odr hidden void @weak_odr_caller_of_zar_2(
153159
; CHECK-SAME: ptr [[TMP0:%.*]]) {
154-
; CHECK-NEXT: tail call void @weak_odr_caller_of_zar_2(ptr [[TMP0]])
160+
; CHECK-NEXT: tail call void @hidden_caller_of_zar_1(ptr [[TMP0]])
155161
; CHECK-NEXT: ret void
156162
;

0 commit comments

Comments
 (0)