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