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