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