[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / Transforms / CallSiteSplitting / callsite-split.ll
blob256261d0dd11ffd8b597e54b8c319f3c36637f62
1 ; RUN: opt < %s -passes='function(callsite-splitting),cgscc(inline),function(instcombine,jump-threading)' -S | FileCheck %s
3 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4 target triple = "aarch64"
6 %struct.bitmap = type { i32, ptr }
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)
16 define void @caller(i1 %c, ptr %a_elt, ptr %b_elt) {
17 entry:
18   br label %Top
20 Top:
21   %tobool1 = icmp eq ptr %a_elt, null
22   br i1 %tobool1, label %CallSiteBB, label %NextCond
24 NextCond:
25   %cmp = icmp ne ptr %b_elt, null
26   br i1 %cmp, label %CallSiteBB, label %End
28 CallSiteBB:
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
33 End:
34   ret void
37 define void @callee(ptr %dst_elt, ptr %a_elt, ptr %b_elt, i1 %c) {
38 entry:
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
44 Cond:
45   %cmp = icmp eq ptr  %dst_elt, %a_elt
46   br i1 %cmp, label %Small, label %Big
48 Small:
49   call void @dummy2(ptr %a_elt)
50   br label %End
52 Big:
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
62 End:
63   ret void
66 declare void @dummy2(ptr)
67 declare void @dummy1(ptr, ptr, ptr, ptr, ptr, ptr)
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)
77 define void @caller2(i1 %c, ptr %a_elt, ptr %b_elt, ptr %c_elt) {
78 entry:
79   br label %Top
81 Top:
82   %tobool1 = icmp eq ptr %a_elt, %b_elt
83   br i1 %tobool1, label %CallSiteBB, label %NextCond
85 NextCond:
86   %cmp = icmp ne ptr %b_elt, %c_elt
87   br i1 %cmp, label %CallSiteBB, label %End
89 CallSiteBB:
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
95 End:
96   ret void
99 define i1 @callee2(i1 %b) {
100 entry:
101   br i1 %b, label %BB1, label %BB2
103 BB1:
104   call void @dummy3()
105   br label %End
107 BB2:
108   call void @dummy4()
109   br label %End
111 End:
112   ret i1 %b
115 declare void @dummy3()
116 declare void @dummy4()
117 declare void @foo(i1)