xref: /llvm-project/llvm/test/Transforms/PGOProfile/fix_bfi.ll (revision e3cf80c5c1fe55efd8216575ccadea0ab087e79c)
1; Note: Scaling the func entry count (using the sum of count value) so that BFI counter value is close to raw profile counter values.
2; RUN: llvm-profdata merge %S/Inputs/fix_bfi.proftext -o %t.profdata
3; RUN: opt -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S -pgo-fix-entry-count=true < %s 2>&1 | FileCheck %s
4
5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6target triple = "x86_64-unknown-linux-gnu"
7
8%struct.basket = type { ptr, i64, i64 }
9%struct.arc = type { i64, ptr, ptr, i32, ptr, ptr, i64, i64 }
10%struct.node = type { i64, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, i64, i32, i32 }
11
12@perm = internal unnamed_addr global [351 x ptr] zeroinitializer, align 16
13
14define dso_local void @sort_basket(i64 %min, i64 %max) {
15entry:
16  %add = add nsw i64 %min, %max
17  %div = sdiv i64 %add, 2
18  %arrayidx = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %div
19  %0 = load ptr, ptr %arrayidx, align 8
20  %abs_cost = getelementptr inbounds %struct.basket, ptr %0, i64 0, i32 2
21  %1 = load i64, ptr %abs_cost, align 8
22  br label %do.body
23
24do.body:
25  %r.0 = phi i64 [ %max, %entry ], [ %r.2, %if.end ]
26  %l.0 = phi i64 [ %min, %entry ], [ %l.2, %if.end ]
27  br label %while.cond
28
29while.cond:
30  %l.1 = phi i64 [ %l.0, %do.body ], [ %inc, %while.body ]
31  %arrayidx1 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %l.1
32  %2 = load ptr, ptr %arrayidx1, align 8
33  %abs_cost2 = getelementptr inbounds %struct.basket, ptr %2, i64 0, i32 2
34  %3 = load i64, ptr %abs_cost2, align 8
35  %cmp = icmp sgt i64 %3, %1
36  br i1 %cmp, label %while.body, label %while.cond3
37
38while.body:
39  %inc = add nsw i64 %l.1, 1
40  br label %while.cond
41
42while.cond3:
43  %r.1 = phi i64 [ %r.0, %while.cond ], [ %dec, %while.body7 ]
44  %arrayidx4 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %r.1
45  %4 = load ptr, ptr %arrayidx4, align 8
46  %abs_cost5 = getelementptr inbounds %struct.basket, ptr %4, i64 0, i32 2
47  %5 = load i64, ptr %abs_cost5, align 8
48  %cmp6 = icmp sgt i64 %1, %5
49  br i1 %cmp6, label %while.body7, label %while.end8
50
51while.body7:
52  %dec = add nsw i64 %r.1, -1
53  br label %while.cond3
54
55while.end8:
56  %cmp9 = icmp slt i64 %l.1, %r.1
57  br i1 %cmp9, label %if.then, label %if.end
58
59if.then:
60  %6 = load i64, ptr %arrayidx1, align 8
61  store ptr %4, ptr %arrayidx1, align 8
62  store i64 %6, ptr %arrayidx4, align 8
63  br label %if.end
64
65if.end:
66  %cmp14 = icmp sgt i64 %l.1, %r.1
67  %not.cmp14 = xor i1 %cmp14, true
68  %7 = zext i1 %not.cmp14 to i64
69  %r.2 = sub i64 %r.1, %7
70  %not.cmp1457 = xor i1 %cmp14, true
71  %inc16 = zext i1 %not.cmp1457 to i64
72  %l.2 = add nsw i64 %l.1, %inc16
73  %cmp19 = icmp sgt i64 %l.2, %r.2
74  br i1 %cmp19, label %do.end, label %do.body
75
76do.end:
77  %cmp20 = icmp sgt i64 %r.2, %min
78  br i1 %cmp20, label %if.then21, label %if.end22
79
80if.then21:
81  call void @sort_basket(i64 %min, i64 %r.2)
82  br label %if.end22
83
84if.end22:
85  %cmp23 = icmp slt i64 %l.2, %max
86  %cmp24 = icmp slt i64 %l.2, 51
87  %or.cond = and i1 %cmp23, %cmp24
88  br i1 %or.cond, label %if.then25, label %if.end26
89
90if.then25:
91  call void @sort_basket(i64 %l.2, i64 %max)
92  br label %if.end26
93
94if.end26:
95  ret void
96}
97
98; CHECK: define dso_local void @sort_basket(i64 %min, i64 %max) #0 !prof [[ENTRY_COUNT:![0-9]+]]
99; CHECK: [[ENTRY_COUNT]] = !{!"function_entry_count", i64 13338888}
100