xref: /llvm-project/llvm/test/Transforms/Inline/inline-cold-callsite.ll (revision 5c97507e2b67ee9194d7eb0a8162ec86ce12afc3)
1
2; RUN: opt < %s -passes='require<profile-summary>,cgscc(inline)' -inline-threshold=100 -inline-cold-callsite-threshold=0 -S | FileCheck %s
3
4; This tests that a cold callsite gets the inline-cold-callsite-threshold
5; and does not get inlined. Another callsite to an identical callee that
6; is not cold gets inlined because cost is below the inline-threshold.
7
8define void @callee() "function-inline-cost"="10" {
9  call void @extern()
10  ret void
11}
12
13declare void @extern()
14declare i1 @ext(i32)
15
16; CHECK-LABEL: caller
17define i32 @caller(i32 %n) {
18entry:
19  %cmp4 = icmp sgt i32 %n, 0
20  br i1 %cmp4, label %for.body, label %for.cond.cleanup
21
22for.cond.cleanup:
23  ret i32 0
24
25for.body:
26  %i.05 = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
27; CHECK: %call = tail call
28  %call = tail call zeroext i1 @ext(i32 %i.05)
29; CHECK-NOT: call void @callee
30; CHECK-NEXT: call void @extern
31  call void @callee()
32  br i1 %call, label %cold, label %for.inc, !prof !0
33
34cold:
35; CHECK: call void @callee
36  call void @callee()
37  br label %for.inc
38
39for.inc:
40  %inc = add nuw nsw i32 %i.05, 1
41  %exitcond = icmp eq i32 %inc, %n
42  br i1 %exitcond, label %for.cond.cleanup, label %for.body
43}
44
45
46!0 = !{!"branch_weights", i32 1, i32 2000}
47