105 lines · plain
1; RUN: opt < %s -passes=callsite-splitting -verify-dom-info -S | FileCheck %s2 3;CHECK-LABEL: @caller4;CHECK-LABEL: Top.split:5;CHECK: %ca1 = musttail call ptr @callee(ptr null, ptr %b)6;CHECK: %cb2 = bitcast ptr %ca1 to ptr7;CHECK: ret ptr %cb28;CHECK-LABEL: TBB.split9;CHECK: %ca3 = musttail call ptr @callee(ptr nonnull %a, ptr null)10;CHECK: %cb4 = bitcast ptr %ca3 to ptr11;CHECK: ret ptr %cb412define ptr @caller(ptr %a, ptr %b) {13Top:14 %c = icmp eq ptr %a, null15 br i1 %c, label %Tail, label %TBB16TBB:17 %c2 = icmp eq ptr %b, null18 br i1 %c2, label %Tail, label %End19Tail:20 %ca = musttail call ptr @callee(ptr %a, ptr %b)21 %cb = bitcast ptr %ca to ptr22 ret ptr %cb23End:24 ret ptr null25}26 27define ptr @callee(ptr %a, ptr %b) noinline {28 ret ptr %a29}30 31;CHECK-LABEL: @no_cast_caller32;CHECK-LABEL: Top.split:33;CHECK: %ca1 = musttail call ptr @callee(ptr null, ptr %b)34;CHECK: ret ptr %ca135;CHECK-LABEL: TBB.split36;CHECK: %ca2 = musttail call ptr @callee(ptr nonnull %a, ptr null)37;CHECK: ret ptr %ca238define ptr @no_cast_caller(ptr %a, ptr %b) {39Top:40 %c = icmp eq ptr %a, null41 br i1 %c, label %Tail, label %TBB42TBB:43 %c2 = icmp eq ptr %b, null44 br i1 %c2, label %Tail, label %End45Tail:46 %ca = musttail call ptr @callee(ptr %a, ptr %b)47 ret ptr %ca48End:49 ret ptr null50}51 52;CHECK-LABEL: @void_caller53;CHECK-LABEL: Top.split:54;CHECK: musttail call void @void_callee(ptr null, ptr %b)55;CHECK: ret void56;CHECK-LABEL: TBB.split57;CHECK: musttail call void @void_callee(ptr nonnull %a, ptr null)58;CHECK: ret void59define void @void_caller(ptr %a, ptr %b) {60Top:61 %c = icmp eq ptr %a, null62 br i1 %c, label %Tail, label %TBB63TBB:64 %c2 = icmp eq ptr %b, null65 br i1 %c2, label %Tail, label %End66Tail:67 musttail call void @void_callee(ptr %a, ptr %b)68 ret void69End:70 ret void71}72 73define void @void_callee(ptr %a, ptr %b) noinline {74 ret void75}76 77; Include a test with a larger CFG that exercises the DomTreeUpdater78; machinery a bit more.79;CHECK-LABEL: @larger_cfg_caller80;CHECK-LABEL: Top.split:81;CHECK: %r1 = musttail call ptr @callee(ptr null, ptr %b)82;CHECK: ret ptr %r183;CHECK-LABEL: TBB.split84;CHECK: %r2 = musttail call ptr @callee(ptr nonnull %a, ptr null)85;CHECK: ret ptr %r286define ptr @larger_cfg_caller(ptr %a, ptr %b) {87Top:88 %cond1 = icmp eq ptr %a, null89 br i1 %cond1, label %Tail, label %ExtraTest90ExtraTest:91 %a0 = load i8, ptr %a92 %cond2 = icmp eq i8 %a0, 093 br i1 %cond2, label %TBB_pred, label %End94TBB_pred:95 br label %TBB96TBB:97 %cond3 = icmp eq ptr %b, null98 br i1 %cond3, label %Tail, label %End99Tail:100 %r = musttail call ptr @callee(ptr %a, ptr %b)101 ret ptr %r102End:103 ret ptr null104}105