Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / MergeFunc / alias.ll
blobe4fe1b8a391656c835784e96c8b226236e680d49
1 ; RUN: opt -S -passes=mergefunc -mergefunc-use-aliases < %s | FileCheck %s
3 ; Aliases should always be created for the weak functions, and
4 ; for external functions if there is no local function
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
14 ; A strong backing function had to be created for the weak-weak pair
16 ; CHECK: define private void @0(ptr %a) unnamed_addr
17 ; CHECK-NEXT: call void @dummy4()
19 ; These internal functions are dropped in favor of the external ones
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
26 ; Only used to mark which functions should be merged.
27 declare void @dummy1()
28 declare void @dummy2()
29 declare void @dummy3()
30 declare void @dummy4()
31 declare void @dummy5()
32 declare void @dummy6()
33 declare void @dummy7()
34 declare void @dummy8()
35 declare void @dummy9()
37 define void @external_external_1(ptr %a) unnamed_addr {
38   call void @dummy1()
39   ret void
41 define void @external_external_2(ptr %a) unnamed_addr {
42   call void @dummy1()
43   ret void
46 define void @external_internal_1(ptr %a) unnamed_addr {
47   call void @dummy2()
48   ret void
50 define internal void @external_internal_2(ptr %a) unnamed_addr {
51   call void @dummy2()
52   ret void
55 define internal void @internal_external_1(ptr %a) unnamed_addr {
56   call void @dummy3()
57   ret void
59 define void @internal_external_2(ptr %a) unnamed_addr {
60   call void @dummy3()
61   ret void
64 define weak void @weak_weak_1(ptr %a) unnamed_addr {
65   call void @dummy4()
66   ret void
68 define weak void @weak_weak_2(ptr %a) unnamed_addr {
69   call void @dummy4()
70   ret void
73 define weak void @weak_external_1(ptr %a) unnamed_addr {
74   call void @dummy5()
75   ret void
77 define external void @weak_external_2(ptr %a) unnamed_addr {
78   call void @dummy5()
79   ret void
82 define external void @external_weak_1(ptr %a) unnamed_addr {
83   call void @dummy6()
84   ret void
86 define weak void @external_weak_2(ptr %a) unnamed_addr {
87   call void @dummy6()
88   ret void
91 define weak void @weak_internal_1(ptr %a) unnamed_addr {
92   call void @dummy7()
93   ret void
95 define internal void @weak_internal_2(ptr %a) unnamed_addr {
96   call void @dummy7()
97   ret void
100 define internal void @internal_weak_1(ptr %a) unnamed_addr {
101   call void @dummy8()
102   ret void
104 define weak void @internal_weak_2(ptr %a) unnamed_addr {
105   call void @dummy8()
106   ret void
109 define internal void @internal_internal_1(ptr %a) unnamed_addr {
110   call void @dummy9()
111   ret void
113 define internal void @internal_internal_2(ptr %a) unnamed_addr {
114   call void @dummy9()
115   ret void