xref: /llvm-project/llvm/test/Transforms/MergeFunc/alias.ll (revision ee2789001b8558656a13502f0de2c81dcb419430)
1; RUN: opt -S -passes=mergefunc -mergefunc-use-aliases < %s | FileCheck %s
2
3; Aliases should always be created for the weak functions, and
4; for external functions if there is no local function
5
6; CHECK: @external_external_2 = unnamed_addr alias void (ptr), ptr @external_external_1
7; CHECK: @weak_weak_2 = weak unnamed_addr alias void (ptr), ptr @0
8; CHECK: @weak_weak_1 = weak unnamed_addr alias void (ptr), ptr @0
9; CHECK: @weak_external_1 = weak unnamed_addr alias void (ptr), ptr @weak_external_2
10; CHECK: @external_weak_2 = weak unnamed_addr alias void (ptr), ptr @external_weak_1
11; CHECK: @weak_internal_1 = weak unnamed_addr alias void (ptr), ptr @weak_internal_2
12; CHECK: @internal_weak_2 = weak unnamed_addr alias void (ptr), ptr @internal_weak_1
13
14; A strong backing function had to be created for the weak-weak pair
15
16; CHECK: define private void @0(ptr %a) unnamed_addr
17; CHECK-NEXT: call void @dummy4()
18
19; These internal functions are dropped in favor of the external ones
20
21; CHECK-NOT: define internal void @external_internal_2(ptr %a) unnamed_addr
22; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr
23; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr
24; CHECK-NOT: define internal void @internal_external_2(ptr %a) unnamed_addr
25
26; Only used to mark which functions should be merged.
27declare void @dummy1()
28declare void @dummy2()
29declare void @dummy3()
30declare void @dummy4()
31declare void @dummy5()
32declare void @dummy6()
33declare void @dummy7()
34declare void @dummy8()
35declare void @dummy9()
36
37define void @external_external_1(ptr %a) unnamed_addr {
38  call void @dummy1()
39  ret void
40}
41define void @external_external_2(ptr %a) unnamed_addr {
42  call void @dummy1()
43  ret void
44}
45
46define void @external_internal_1(ptr %a) unnamed_addr {
47  call void @dummy2()
48  ret void
49}
50define internal void @external_internal_2(ptr %a) unnamed_addr {
51  call void @dummy2()
52  ret void
53}
54
55define internal void @internal_external_1(ptr %a) unnamed_addr {
56  call void @dummy3()
57  ret void
58}
59define void @internal_external_2(ptr %a) unnamed_addr {
60  call void @dummy3()
61  ret void
62}
63
64define weak void @weak_weak_1(ptr %a) unnamed_addr {
65  call void @dummy4()
66  ret void
67}
68define weak void @weak_weak_2(ptr %a) unnamed_addr {
69  call void @dummy4()
70  ret void
71}
72
73define weak void @weak_external_1(ptr %a) unnamed_addr {
74  call void @dummy5()
75  ret void
76}
77define external void @weak_external_2(ptr %a) unnamed_addr {
78  call void @dummy5()
79  ret void
80}
81
82define external void @external_weak_1(ptr %a) unnamed_addr {
83  call void @dummy6()
84  ret void
85}
86define weak void @external_weak_2(ptr %a) unnamed_addr {
87  call void @dummy6()
88  ret void
89}
90
91define weak void @weak_internal_1(ptr %a) unnamed_addr {
92  call void @dummy7()
93  ret void
94}
95define internal void @weak_internal_2(ptr %a) unnamed_addr {
96  call void @dummy7()
97  ret void
98}
99
100define internal void @internal_weak_1(ptr %a) unnamed_addr {
101  call void @dummy8()
102  ret void
103}
104define weak void @internal_weak_2(ptr %a) unnamed_addr {
105  call void @dummy8()
106  ret void
107}
108
109define internal void @internal_internal_1(ptr %a) unnamed_addr {
110  call void @dummy9()
111  ret void
112}
113define internal void @internal_internal_2(ptr %a) unnamed_addr {
114  call void @dummy9()
115  ret void
116}
117