1; RUN: opt < %s -callsite-splitting -verify-dom-info -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 12define i8* @caller(i8* %a, i8* %b) { 13Top: 14 %c = icmp eq i8* %a, null 15 br i1 %c, label %Tail, label %TBB 16TBB: 17 %c2 = icmp eq i8* %b, null 18 br i1 %c2, label %Tail, label %End 19Tail: 20 %ca = musttail call i8* @callee(i8* %a, i8* %b) 21 %cb = bitcast i8* %ca to i8* 22 ret i8* %cb 23End: 24 ret i8* null 25} 26 27define 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 38define i8* @no_cast_caller(i8* %a, i8* %b) { 39Top: 40 %c = icmp eq i8* %a, null 41 br i1 %c, label %Tail, label %TBB 42TBB: 43 %c2 = icmp eq i8* %b, null 44 br i1 %c2, label %Tail, label %End 45Tail: 46 %ca = musttail call i8* @callee(i8* %a, i8* %b) 47 ret i8* %ca 48End: 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 59define void @void_caller(i8* %a, i8* %b) { 60Top: 61 %c = icmp eq i8* %a, null 62 br i1 %c, label %Tail, label %TBB 63TBB: 64 %c2 = icmp eq i8* %b, null 65 br i1 %c2, label %Tail, label %End 66Tail: 67 musttail call void @void_callee(i8* %a, i8* %b) 68 ret void 69End: 70 ret void 71} 72 73define void @void_callee(i8* %a, i8* %b) noinline { 74 ret void 75} 76 77; Include a test with a larger CFG that exercises the DomTreeUpdater 78; machinery a bit more. 79;CHECK-LABEL: @larger_cfg_caller 80;CHECK-LABEL: Top.split: 81;CHECK: %r1 = musttail call i8* @callee(i8* null, i8* %b) 82;CHECK: ret i8* %r1 83;CHECK-LABEL: TBB.split 84;CHECK: %r2 = musttail call i8* @callee(i8* nonnull %a, i8* null) 85;CHECK: ret i8* %r2 86define i8* @larger_cfg_caller(i8* %a, i8* %b) { 87Top: 88 %cond1 = icmp eq i8* %a, null 89 br i1 %cond1, label %Tail, label %ExtraTest 90ExtraTest: 91 %a0 = load i8, i8* %a 92 %cond2 = icmp eq i8 %a0, 0 93 br i1 %cond2, label %TBB_pred, label %End 94TBB_pred: 95 br label %TBB 96TBB: 97 %cond3 = icmp eq i8* %b, null 98 br i1 %cond3, label %Tail, label %End 99Tail: 100 %r = musttail call i8* @callee(i8* %a, i8* %b) 101 ret i8* %r 102End: 103 ret i8* null 104} 105