blob: ee1c7af5e817f9aacca4a5db50a109acd51a98a1 [file] [log] [blame]
Nikita Popov6f54fb02018-11-21 19:37:19 +00001; RUN: opt -S -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 (float*), bitcast (void (i32*)* @external_external_1 to void (float*)*)
7; CHECK: @weak_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @0 to void (float*)*)
8; CHECK: @weak_weak_1 = weak unnamed_addr alias void (i32*), void (i32*)* @0
9; CHECK: @weak_external_1 = weak unnamed_addr alias void (i32*), bitcast (void (float*)* @weak_external_2 to void (i32*)*)
10; CHECK: @external_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @external_weak_1 to void (float*)*)
11; CHECK: @weak_internal_1 = weak unnamed_addr alias void (i32*), bitcast (void (float*)* @weak_internal_2 to void (i32*)*)
12; CHECK: @internal_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @internal_weak_1 to void (float*)*)
13
14; A strong backing function had to be created for the weak-weak pair
15
16; CHECK: define private void @0(i32* %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(float *%a) unnamed_addr
22; CHECK-NOT: define internal void @internal_external_1(i32 *%a) unnamed_addr
23; CHECK-NOT: define internal void @internal_external_1(i32 *%a) unnamed_addr
24; CHECK-NOT: define internal void @internal_external_2(float *%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(i32 *%a) unnamed_addr {
38 call void @dummy1()
39 ret void
40}
41define void @external_external_2(float *%a) unnamed_addr {
42 call void @dummy1()
43 ret void
44}
45
46define void @external_internal_1(i32 *%a) unnamed_addr {
47 call void @dummy2()
48 ret void
49}
50define internal void @external_internal_2(float *%a) unnamed_addr {
51 call void @dummy2()
52 ret void
53}
54
55define internal void @internal_external_1(i32 *%a) unnamed_addr {
56 call void @dummy3()
57 ret void
58}
59define void @internal_external_2(float *%a) unnamed_addr {
60 call void @dummy3()
61 ret void
62}
63
64define weak void @weak_weak_1(i32 *%a) unnamed_addr {
65 call void @dummy4()
66 ret void
67}
68define weak void @weak_weak_2(float *%a) unnamed_addr {
69 call void @dummy4()
70 ret void
71}
72
73define weak void @weak_external_1(i32 *%a) unnamed_addr {
74 call void @dummy5()
75 ret void
76}
77define external void @weak_external_2(float *%a) unnamed_addr {
78 call void @dummy5()
79 ret void
80}
81
82define external void @external_weak_1(i32 *%a) unnamed_addr {
83 call void @dummy6()
84 ret void
85}
86define weak void @external_weak_2(float *%a) unnamed_addr {
87 call void @dummy6()
88 ret void
89}
90
91define weak void @weak_internal_1(i32 *%a) unnamed_addr {
92 call void @dummy7()
93 ret void
94}
95define internal void @weak_internal_2(float *%a) unnamed_addr {
96 call void @dummy7()
97 ret void
98}
99
100define internal void @internal_weak_1(i32 *%a) unnamed_addr {
101 call void @dummy8()
102 ret void
103}
104define weak void @internal_weak_2(float *%a) unnamed_addr {
105 call void @dummy8()
106 ret void
107}
108
109define internal void @internal_internal_1(i32 *%a) unnamed_addr {
110 call void @dummy9()
111 ret void
112}
113define internal void @internal_internal_2(float *%a) unnamed_addr {
114 call void @dummy9()
115 ret void
116}