xref: /llvm-project/llvm/test/Transforms/CallSiteSplitting/noduplicate.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
154c4609fSRoman Lebedev; RUN: opt -S -passes=callsite-splitting -callsite-splitting-duplication-threshold=100000000 < %s | FileCheck -enable-var-scope %s
2f80c4241SMatt Arsenault
3f80c4241SMatt Arsenault; Noduplicate calls should not be duplicated
4f80c4241SMatt Arsenault; CHECK-LABEL: define void @noduplicate_caller(
5f80c4241SMatt Arsenault; CHECK: call void @noduplicate_callee(
6f80c4241SMatt Arsenault; CHECK-NOT: call void @noduplicate_callee(
7*055fb779SNikita Popovdefine void @noduplicate_caller(i1 %c, ptr %a_elt, ptr %b_elt) #0 {
8f80c4241SMatt Arsenaultentry:
9f80c4241SMatt Arsenault  br label %Top
10f80c4241SMatt Arsenault
11f80c4241SMatt ArsenaultTop:
12*055fb779SNikita Popov  %tobool1 = icmp eq ptr %a_elt, null
13f80c4241SMatt Arsenault  br i1 %tobool1, label %CallSiteBB, label %NextCond
14f80c4241SMatt Arsenault
15f80c4241SMatt ArsenaultNextCond:
16*055fb779SNikita Popov  %cmp = icmp ne ptr %b_elt, null
17f80c4241SMatt Arsenault  br i1 %cmp, label %CallSiteBB, label %End
18f80c4241SMatt Arsenault
19f80c4241SMatt ArsenaultCallSiteBB:
20f80c4241SMatt Arsenault  %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
21*055fb779SNikita Popov  call void @noduplicate_callee(ptr %a_elt, i1 %p)
22f80c4241SMatt Arsenault  br label %End
23f80c4241SMatt Arsenault
24f80c4241SMatt ArsenaultEnd:
25f80c4241SMatt Arsenault  ret void
26f80c4241SMatt Arsenault}
27f80c4241SMatt Arsenault
28f80c4241SMatt Arsenault; CHECK-LABEL: define void @noduplicate_callee(
29f80c4241SMatt Arsenault; CHECK: call void @noduplicate_external(
30f80c4241SMatt Arsenault; CHECK-NOT: call void @noduplicate_external(
31*055fb779SNikita Popovdefine void @noduplicate_callee(ptr %a_elt, i1 %c) #0 {
32f80c4241SMatt Arsenaultentry:
33*055fb779SNikita Popov  %tobool = icmp ne ptr %a_elt, null
34f80c4241SMatt Arsenault  br i1 %tobool, label %then, label %endif
35f80c4241SMatt Arsenault
36f80c4241SMatt Arsenaultthen:
37f80c4241SMatt Arsenault  br label %endif
38f80c4241SMatt Arsenault
39f80c4241SMatt Arsenaultendif:
40*055fb779SNikita Popov  call void @noduplicate_external(ptr %a_elt) #0
41f80c4241SMatt Arsenault  ret void
42f80c4241SMatt Arsenault}
43f80c4241SMatt Arsenault
44f80c4241SMatt Arsenault; Make sure an otherwise identical function is transformed
45f80c4241SMatt Arsenault; CHECK-LABEL: define void @reference_caller(
46f80c4241SMatt Arsenault; CHECK: call void @nonnoduplicate_callee(
47f80c4241SMatt Arsenault; CHECK: call void @nonnoduplicate_callee(
48*055fb779SNikita Popovdefine void @reference_caller(i1 %c, ptr %a_elt, ptr %b_elt) #1 {
49f80c4241SMatt Arsenaultentry:
50f80c4241SMatt Arsenault  br label %Top
51f80c4241SMatt Arsenault
52f80c4241SMatt ArsenaultTop:
53*055fb779SNikita Popov  %tobool1 = icmp eq ptr %a_elt, null
54f80c4241SMatt Arsenault  br i1 %tobool1, label %CallSiteBB, label %NextCond
55f80c4241SMatt Arsenault
56f80c4241SMatt ArsenaultNextCond:
57*055fb779SNikita Popov  %cmp = icmp ne ptr %b_elt, null
58f80c4241SMatt Arsenault  br i1 %cmp, label %CallSiteBB, label %End
59f80c4241SMatt Arsenault
60f80c4241SMatt ArsenaultCallSiteBB:
61f80c4241SMatt Arsenault  %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
62*055fb779SNikita Popov  call void @nonnoduplicate_callee(ptr %a_elt, i1 %p)
63f80c4241SMatt Arsenault  br label %End
64f80c4241SMatt Arsenault
65f80c4241SMatt ArsenaultEnd:
66f80c4241SMatt Arsenault  ret void
67f80c4241SMatt Arsenault}
68f80c4241SMatt Arsenault
69f80c4241SMatt Arsenault; CHECK-LABEL: define void @nonnoduplicate_callee(
70f80c4241SMatt Arsenault; CHECK: call void @nonnoduplicate_external(
71f80c4241SMatt Arsenault; CHECK-NOT: call void @nonnoduplicate_external(
72*055fb779SNikita Popovdefine void @nonnoduplicate_callee(ptr %a_elt, i1 %c) #1 {
73f80c4241SMatt Arsenaultentry:
74*055fb779SNikita Popov  %tobool = icmp ne ptr %a_elt, null
75f80c4241SMatt Arsenault  br i1 %tobool, label %then, label %endif
76f80c4241SMatt Arsenault
77f80c4241SMatt Arsenaultthen:
78f80c4241SMatt Arsenault  br label %endif
79f80c4241SMatt Arsenault
80f80c4241SMatt Arsenaultendif:
81*055fb779SNikita Popov  call void @nonnoduplicate_external(ptr %a_elt)
82f80c4241SMatt Arsenault  ret void
83f80c4241SMatt Arsenault}
84f80c4241SMatt Arsenault
85*055fb779SNikita Popovdeclare void @noduplicate_external(ptr) #0
86*055fb779SNikita Popovdeclare void @nonnoduplicate_external(ptr) #1
87f80c4241SMatt Arsenault
88f80c4241SMatt Arsenaultattributes #0 = { noduplicate nounwind }
89f80c4241SMatt Arsenaultattributes #1 = { nounwind }
90f80c4241SMatt Arsenault
91