140 lines · plain
1; RUN: opt < %s -passes=callsite-splitting -S | FileCheck %s2; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s3 4; CHECK-LABEL: @test_simple5; CHECK-LABEL: Header:6; CHECK-NEXT: br i1 %arg, label %Header.split7; CHECK-LABEL: Header.split:8; CHECK: %[[CALL1:.*]] = call i32 @callee(ptr %a, i32 %v, i32 %p)9; CHECK-LABEL: TBB:10; CHECK: br i1 %cmp, label %TBB.split11; CHECK-LABEL: TBB.split:12; CHECK: %[[CALL2:.*]] = call i32 @callee(ptr null, i32 %v, i32 %p)13; CHECK-LABEL: Tail14; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]15; CHECK: ret i32 %[[MERGED]]16define i32 @test_simple(ptr %a, i32 %v, i32 %p, i1 %arg) {17Header:18 br i1 %arg, label %Tail, label %End19 20TBB:21 %cmp = icmp eq ptr %a, null22 br i1 %cmp, label %Tail, label %End23 24Tail:25 %r = call i32 @callee(ptr %a, i32 %v, i32 %p)26 ret i32 %r27 28End:29 ret i32 %v30}31 32; CHECK-LABEL: @test_eq_eq_eq_untaken33; CHECK-LABEL: Header:34; CHECK: br i1 %tobool1, label %TBB1, label %Header.split35; CHECK-LABEL: Header.split:36; CHECK: %[[CALL1:.*]] = call i32 @callee(ptr nonnull %a, i32 %v, i32 %p)37; CHECK-LABEL: TBB2:38; CHECK: br i1 %cmp2, label %TBB2.split, label %End39; CHECK-LABEL: TBB2.split:40; CHECK: %[[CALL2:.*]] = call i32 @callee(ptr null, i32 1, i32 99)41; CHECK-LABEL: Tail42; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]43; CHECK: ret i32 %[[MERGED]]44define i32 @test_eq_eq_eq_untaken2(ptr %a, i32 %v, i32 %p) {45Header:46 %tobool1 = icmp eq ptr %a, null47 br i1 %tobool1, label %TBB1, label %Tail48 49TBB1:50 %cmp1 = icmp eq i32 %v, 151 br i1 %cmp1, label %TBB2, label %End52 53TBB2:54 %cmp2 = icmp eq i32 %p, 9955 br i1 %cmp2, label %Tail, label %End56 57Tail:58 %r = call i32 @callee(ptr %a, i32 %v, i32 %p)59 ret i32 %r60 61End:62 ret i32 %v63}64 65; CHECK-LABEL: @test_eq_ne_eq_untaken66; CHECK-LABEL: Header:67; CHECK: br i1 %tobool1, label %TBB1, label %Header.split68; CHECK-LABEL: Header.split:69; CHECK: %[[CALL1:.*]] = call i32 @callee(ptr nonnull %a, i32 %v, i32 %p)70; CHECK-LABEL: TBB2:71; CHECK: br i1 %cmp2, label %TBB2.split, label %End72; CHECK-LABEL: TBB2.split:73; CHECK: %[[CALL2:.*]] = call i32 @callee(ptr null, i32 %v, i32 99)74; CHECK-LABEL: Tail75; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]76; CHECK: ret i32 %[[MERGED]]77define i32 @test_eq_ne_eq_untaken(ptr %a, i32 %v, i32 %p) {78Header:79 %tobool1 = icmp eq ptr %a, null80 br i1 %tobool1, label %TBB1, label %Tail81 82TBB1:83 %cmp1 = icmp ne i32 %v, 184 br i1 %cmp1, label %TBB2, label %End85 86TBB2:87 %cmp2 = icmp eq i32 %p, 9988 br i1 %cmp2, label %Tail, label %End89 90Tail:91 %r = call i32 @callee(ptr %a, i32 %v, i32 %p)92 ret i32 %r93 94End:95 ret i32 %v96}97 98; CHECK-LABEL: @test_header_header2_tbb99; CHECK: Header2:100; CHECK:br i1 %tobool2, label %Header2.split, label %TBB1101; CHECK-LABEL: Header2.split:102; CHECK: %[[CALL1:.*]] = call i32 @callee(ptr nonnull %a, i32 %v, i32 10)103; CHECK-LABEL: TBB2:104; CHECK: br i1 %cmp2, label %TBB2.split, label %End105; CHECK-LABEL: TBB2.split:106; NOTE: CallSiteSplitting cannot infer that %a is null here, as it currently107; only supports recording conditions along a single predecessor path.108; CHECK: %[[CALL2:.*]] = call i32 @callee(ptr %a, i32 1, i32 99)109; CHECK-LABEL: Tail110; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB2.split ]111; CHECK: ret i32 %[[MERGED]]112define i32 @test_header_header2_tbb(ptr %a, i32 %v, i32 %p) {113Header:114 %tobool1 = icmp eq ptr %a, null115 br i1 %tobool1, label %TBB1, label %Header2116 117Header2:118 %tobool2 = icmp eq i32 %p, 10119 br i1 %tobool2, label %Tail, label %TBB1120 121TBB1:122 %cmp1 = icmp eq i32 %v, 1123 br i1 %cmp1, label %TBB2, label %End124 125TBB2:126 %cmp2 = icmp eq i32 %p, 99127 br i1 %cmp2, label %Tail, label %End128 129Tail:130 %r = call i32 @callee(ptr %a, i32 %v, i32 %p)131 ret i32 %r132 133End:134 ret i32 %v135}136 137define i32 @callee(ptr %a, i32 %v, i32 %p) {138 ret i32 10139}140