xref: /aosp_15_r20/external/llvm/test/Transforms/MergeFunc/fold-weak.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -mergefunc < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine weak i32 @sum(i32 %x, i32 %y) {
4*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %y
5*9880d681SAndroid Build Coastguard Worker  %sum2 = add i32 %sum, %y
6*9880d681SAndroid Build Coastguard Worker  %sum3 = add i32 %sum2, %y
7*9880d681SAndroid Build Coastguard Worker  ret i32 %sum3
8*9880d681SAndroid Build Coastguard Worker}
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine weak i32 @add(i32 %x, i32 %y) {
11*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %y
12*9880d681SAndroid Build Coastguard Worker  %sum2 = add i32 %sum, %y
13*9880d681SAndroid Build Coastguard Worker  %sum3 = add i32 %sum2, %y
14*9880d681SAndroid Build Coastguard Worker  ret i32 %sum3
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; Don't replace a weak function use by another equivalent function. We don't
18*9880d681SAndroid Build Coastguard Worker; know whether the symbol that will ulitmately be linked is equivalent - we
19*9880d681SAndroid Build Coastguard Worker; don't know that the weak definition is the definitive definition or whether it
20*9880d681SAndroid Build Coastguard Worker; will be overriden by a stronger definition).
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define private i32 @0
23*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
24*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
25*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
26*9880d681SAndroid Build Coastguard Worker; CHECK: ret
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @use_weak
29*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @add
30*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @sum
31*9880d681SAndroid Build Coastguard Worker; CHECK: ret
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define weak i32 @sum
34*9880d681SAndroid Build Coastguard Worker; CHECK:  tail call i32 @0
35*9880d681SAndroid Build Coastguard Worker; CHECK:  ret
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define weak i32 @add
38*9880d681SAndroid Build Coastguard Worker; CHECK:  tail call i32 @0
39*9880d681SAndroid Build Coastguard Worker; CHECK:  ret
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine i32 @use_weak(i32 %a, i32 %b) {
43*9880d681SAndroid Build Coastguard Worker  %res = call i32 @add(i32 %a, i32 %b)
44*9880d681SAndroid Build Coastguard Worker  %res2 = call i32 @sum(i32 %a, i32 %b)
45*9880d681SAndroid Build Coastguard Worker  %res3 = add i32 %res, %res2
46*9880d681SAndroid Build Coastguard Worker  ret i32 %res3
47*9880d681SAndroid Build Coastguard Worker}
48