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