Home | History | Annotate | Download | only in CallSiteSplitting
      1 ; RUN: opt < %s -callsite-splitting -S | FileCheck %s
      2 
      3 ;CHECK-LABEL: @caller
      4 ;CHECK-LABEL: Top.split:
      5 ;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b)
      6 ;CHECK: %cb2 = bitcast i8* %ca1 to i8*
      7 ;CHECK: ret i8* %cb2
      8 ;CHECK-LABEL: TBB.split
      9 ;CHECK: %ca3 = musttail call i8* @callee(i8* nonnull %a, i8* null)
     10 ;CHECK: %cb4 = bitcast i8* %ca3 to i8*
     11 ;CHECK: ret i8* %cb4
     12 define i8* @caller(i8* %a, i8* %b) {
     13 Top:
     14   %c = icmp eq i8* %a, null
     15   br i1 %c, label %Tail, label %TBB
     16 TBB:
     17   %c2 = icmp eq i8* %b, null
     18   br i1 %c2, label %Tail, label %End
     19 Tail:
     20   %ca = musttail call i8* @callee(i8* %a, i8* %b)
     21   %cb = bitcast i8* %ca to i8*
     22   ret i8* %cb
     23 End:
     24   ret i8* null
     25 }
     26 
     27 define i8* @callee(i8* %a, i8* %b) noinline {
     28   ret i8* %a
     29 }
     30 
     31 ;CHECK-LABEL: @no_cast_caller
     32 ;CHECK-LABEL: Top.split:
     33 ;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b)
     34 ;CHECK: ret i8* %ca1
     35 ;CHECK-LABEL: TBB.split
     36 ;CHECK: %ca2 = musttail call i8* @callee(i8* nonnull %a, i8* null)
     37 ;CHECK: ret i8* %ca2
     38 define i8* @no_cast_caller(i8* %a, i8* %b) {
     39 Top:
     40   %c = icmp eq i8* %a, null
     41   br i1 %c, label %Tail, label %TBB
     42 TBB:
     43   %c2 = icmp eq i8* %b, null
     44   br i1 %c2, label %Tail, label %End
     45 Tail:
     46   %ca = musttail call i8* @callee(i8* %a, i8* %b)
     47   ret i8* %ca
     48 End:
     49   ret i8* null
     50 }
     51 
     52 ;CHECK-LABEL: @void_caller
     53 ;CHECK-LABEL: Top.split:
     54 ;CHECK: musttail call void @void_callee(i8* null, i8* %b)
     55 ;CHECK: ret void
     56 ;CHECK-LABEL: TBB.split
     57 ;CHECK: musttail call void @void_callee(i8* nonnull %a, i8* null)
     58 ;CHECK: ret void
     59 define void @void_caller(i8* %a, i8* %b) {
     60 Top:
     61   %c = icmp eq i8* %a, null
     62   br i1 %c, label %Tail, label %TBB
     63 TBB:
     64   %c2 = icmp eq i8* %b, null
     65   br i1 %c2, label %Tail, label %End
     66 Tail:
     67   musttail call void @void_callee(i8* %a, i8* %b)
     68   ret void
     69 End:
     70   ret void
     71 }
     72 
     73 define void @void_callee(i8* %a, i8* %b) noinline {
     74   ret void
     75 }
     76