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