xref: /llvm-project/llvm/test/Transforms/CallSiteSplitting/callsite-split.ll (revision 78f2eb8d0f9cf5e8a79b64f6d64deeb487502e38)
1; RUN: opt < %s -passes='function(callsite-splitting),cgscc(inline),function(instcombine,jump-threading)' -S | FileCheck %s
2
3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4target triple = "aarch64"
5
6%struct.bitmap = type { i32, ptr }
7
8;CHECK-LABEL: @caller
9;CHECK-LABEL: Top.split:
10;CHECK: call void @callee(ptr null, ptr null, ptr %b_elt, i1 false)
11;CHECK-LABEL: NextCond:
12;CHECK: br {{.*}} label %callee.exit
13;CHECK-LABEL: callee.exit:
14;CHECK: call void @dummy2(ptr %a_elt)
15
16define void @caller(i1 %c, ptr %a_elt, ptr %b_elt) {
17entry:
18  br label %Top
19
20Top:
21  %tobool1 = icmp eq ptr %a_elt, null
22  br i1 %tobool1, label %CallSiteBB, label %NextCond
23
24NextCond:
25  %cmp = icmp ne ptr %b_elt, null
26  br i1 %cmp, label %CallSiteBB, label %End
27
28CallSiteBB:
29  %p = phi i1 [0, %Top], [%c, %NextCond]
30  call void @callee(ptr %a_elt, ptr %a_elt, ptr %b_elt, i1 %p)
31  br label %End
32
33End:
34  ret void
35}
36
37define void @callee(ptr %dst_elt, ptr %a_elt, ptr %b_elt, i1 %c) {
38entry:
39  %tobool = icmp ne ptr %a_elt, null
40  %tobool1 = icmp ne ptr %b_elt, null
41  %or.cond = and i1 %tobool, %tobool1
42  br i1 %or.cond, label %Cond, label %Big
43
44Cond:
45  %cmp = icmp eq ptr  %dst_elt, %a_elt
46  br i1 %cmp, label %Small, label %Big
47
48Small:
49  call void @dummy2(ptr %a_elt)
50  br label %End
51
52Big:
53  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
54  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
55  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
56  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
57  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
58  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
59  call void @dummy1(ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt, ptr %a_elt)
60  br label %End
61
62End:
63  ret void
64}
65
66declare void @dummy2(ptr)
67declare void @dummy1(ptr, ptr, ptr, ptr, ptr, ptr)
68
69
70;CHECK-LABEL: @caller2
71;CHECK-LABEL: Top.split:
72;CHECK: call void @dummy4()
73;CHECK-LABEL: NextCond.split:
74;CHECK: call void @dummy3()
75;CheCK-LABEL: CallSiteBB:
76;CHECK: call void @foo(i1 %tobool1)
77define void @caller2(i1 %c, ptr %a_elt, ptr %b_elt, ptr %c_elt) {
78entry:
79  br label %Top
80
81Top:
82  %tobool1 = icmp eq ptr %a_elt, %b_elt
83  br i1 %tobool1, label %CallSiteBB, label %NextCond
84
85NextCond:
86  %cmp = icmp ne ptr %b_elt, %c_elt
87  br i1 %cmp, label %CallSiteBB, label %End
88
89CallSiteBB:
90  %phi = phi i1 [0, %Top],[1, %NextCond]
91  %u = call i1 @callee2(i1 %phi)
92  call void @foo(i1 %u)
93  br label %End
94
95End:
96  ret void
97}
98
99define i1 @callee2(i1 %b) {
100entry:
101  br i1 %b, label %BB1, label %BB2
102
103BB1:
104  call void @dummy3()
105  br label %End
106
107BB2:
108  call void @dummy4()
109  br label %End
110
111End:
112  ret i1 %b
113}
114
115declare void @dummy3()
116declare void @dummy4()
117declare void @foo(i1)
118