1; RUN: opt < %s -passes=callsite-splitting -verify-dom-info -S | FileCheck %s 2 3;CHECK-LABEL: @caller 4;CHECK-LABEL: Top.split: 5;CHECK: %ca1 = musttail call ptr @callee(ptr null, ptr %b) 6;CHECK: %cb2 = bitcast ptr %ca1 to ptr 7;CHECK: ret ptr %cb2 8;CHECK-LABEL: TBB.split 9;CHECK: %ca3 = musttail call ptr @callee(ptr nonnull %a, ptr null) 10;CHECK: %cb4 = bitcast ptr %ca3 to ptr 11;CHECK: ret ptr %cb4 12define ptr @caller(ptr %a, ptr %b) { 13Top: 14 %c = icmp eq ptr %a, null 15 br i1 %c, label %Tail, label %TBB 16TBB: 17 %c2 = icmp eq ptr %b, null 18 br i1 %c2, label %Tail, label %End 19Tail: 20 %ca = musttail call ptr @callee(ptr %a, ptr %b) 21 %cb = bitcast ptr %ca to ptr 22 ret ptr %cb 23End: 24 ret ptr null 25} 26 27define ptr @callee(ptr %a, ptr %b) noinline { 28 ret ptr %a 29} 30 31;CHECK-LABEL: @no_cast_caller 32;CHECK-LABEL: Top.split: 33;CHECK: %ca1 = musttail call ptr @callee(ptr null, ptr %b) 34;CHECK: ret ptr %ca1 35;CHECK-LABEL: TBB.split 36;CHECK: %ca2 = musttail call ptr @callee(ptr nonnull %a, ptr null) 37;CHECK: ret ptr %ca2 38define ptr @no_cast_caller(ptr %a, ptr %b) { 39Top: 40 %c = icmp eq ptr %a, null 41 br i1 %c, label %Tail, label %TBB 42TBB: 43 %c2 = icmp eq ptr %b, null 44 br i1 %c2, label %Tail, label %End 45Tail: 46 %ca = musttail call ptr @callee(ptr %a, ptr %b) 47 ret ptr %ca 48End: 49 ret ptr null 50} 51 52;CHECK-LABEL: @void_caller 53;CHECK-LABEL: Top.split: 54;CHECK: musttail call void @void_callee(ptr null, ptr %b) 55;CHECK: ret void 56;CHECK-LABEL: TBB.split 57;CHECK: musttail call void @void_callee(ptr nonnull %a, ptr null) 58;CHECK: ret void 59define void @void_caller(ptr %a, ptr %b) { 60Top: 61 %c = icmp eq ptr %a, null 62 br i1 %c, label %Tail, label %TBB 63TBB: 64 %c2 = icmp eq ptr %b, null 65 br i1 %c2, label %Tail, label %End 66Tail: 67 musttail call void @void_callee(ptr %a, ptr %b) 68 ret void 69End: 70 ret void 71} 72 73define void @void_callee(ptr %a, ptr %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 ptr @callee(ptr null, ptr %b) 82;CHECK: ret ptr %r1 83;CHECK-LABEL: TBB.split 84;CHECK: %r2 = musttail call ptr @callee(ptr nonnull %a, ptr null) 85;CHECK: ret ptr %r2 86define ptr @larger_cfg_caller(ptr %a, ptr %b) { 87Top: 88 %cond1 = icmp eq ptr %a, null 89 br i1 %cond1, label %Tail, label %ExtraTest 90ExtraTest: 91 %a0 = load i8, ptr %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 ptr %b, null 98 br i1 %cond3, label %Tail, label %End 99Tail: 100 %r = musttail call ptr @callee(ptr %a, ptr %b) 101 ret ptr %r 102End: 103 ret ptr null 104} 105