brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 76cb218 Raw
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