117 lines · plain
1; RUN: opt -S -passes=mergefunc -mergefunc-use-aliases < %s | FileCheck %s2 3; Aliases should always be created for the weak functions, and4; for external functions if there is no local function5 6; CHECK: @external_external_2 = unnamed_addr alias void (ptr), ptr @external_external_17; CHECK: @weak_weak_2 = weak unnamed_addr alias void (ptr), ptr @08; CHECK: @weak_weak_1 = weak unnamed_addr alias void (ptr), ptr @09; CHECK: @weak_external_1 = weak unnamed_addr alias void (ptr), ptr @weak_external_210; CHECK: @external_weak_2 = weak unnamed_addr alias void (ptr), ptr @external_weak_111; CHECK: @weak_internal_1 = weak unnamed_addr alias void (ptr), ptr @weak_internal_212; CHECK: @internal_weak_2 = weak unnamed_addr alias void (ptr), ptr @internal_weak_113 14; A strong backing function had to be created for the weak-weak pair15 16; CHECK: define private void @0(ptr %a) unnamed_addr17; CHECK-NEXT: call void @dummy4()18 19; These internal functions are dropped in favor of the external ones20 21; CHECK-NOT: define internal void @external_internal_2(ptr %a) unnamed_addr22; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr23; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr24; CHECK-NOT: define internal void @internal_external_2(ptr %a) unnamed_addr25 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 void40}41define void @external_external_2(ptr %a) unnamed_addr {42 call void @dummy1()43 ret void44}45 46define void @external_internal_1(ptr %a) unnamed_addr {47 call void @dummy2()48 ret void49}50define internal void @external_internal_2(ptr %a) unnamed_addr {51 call void @dummy2()52 ret void53}54 55define internal void @internal_external_1(ptr %a) unnamed_addr {56 call void @dummy3()57 ret void58}59define void @internal_external_2(ptr %a) unnamed_addr {60 call void @dummy3()61 ret void62}63 64define weak void @weak_weak_1(ptr %a) unnamed_addr {65 call void @dummy4()66 ret void67}68define weak void @weak_weak_2(ptr %a) unnamed_addr {69 call void @dummy4()70 ret void71}72 73define weak void @weak_external_1(ptr %a) unnamed_addr {74 call void @dummy5()75 ret void76}77define external void @weak_external_2(ptr %a) unnamed_addr {78 call void @dummy5()79 ret void80}81 82define external void @external_weak_1(ptr %a) unnamed_addr {83 call void @dummy6()84 ret void85}86define weak void @external_weak_2(ptr %a) unnamed_addr {87 call void @dummy6()88 ret void89}90 91define weak void @weak_internal_1(ptr %a) unnamed_addr {92 call void @dummy7()93 ret void94}95define internal void @weak_internal_2(ptr %a) unnamed_addr {96 call void @dummy7()97 ret void98}99 100define internal void @internal_weak_1(ptr %a) unnamed_addr {101 call void @dummy8()102 ret void103}104define weak void @internal_weak_2(ptr %a) unnamed_addr {105 call void @dummy8()106 ret void107}108 109define internal void @internal_internal_1(ptr %a) unnamed_addr {110 call void @dummy9()111 ret void112}113define internal void @internal_internal_2(ptr %a) unnamed_addr {114 call void @dummy9()115 ret void116}117