[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / PGOProfile / fix_bfi.ll
blobeea8c2beb3b4867d03eb40ee2d2ee4b4bd992e50
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 -pgo-instr-use -pgo-test-profile-file=%t.profdata -S -pgo-fix-entry-count=true < %s 2>&1 | FileCheck %s
5 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6 target triple = "x86_64-unknown-linux-gnu"
8 %struct.basket = type { %struct.arc*, i64, i64 }
9 %struct.arc = type { i64, %struct.node*, %struct.node*, i32, %struct.arc*, %struct.arc*, i64, i64 }
10 %struct.node = type { i64, i32, %struct.node*, %struct.node*, %struct.node*, %struct.node*, %struct.arc*, %struct.arc*, %struct.arc*, %struct.arc*, i64, i64, i32, i32 }
12 @perm = internal unnamed_addr global [351 x %struct.basket*] zeroinitializer, align 16
14 define dso_local void @sort_basket(i64 %min, i64 %max) {
15 entry:
16   %add = add nsw i64 %min, %max
17   %div = sdiv i64 %add, 2
18   %arrayidx = getelementptr inbounds [351 x %struct.basket*], [351 x %struct.basket*]* @perm, i64 0, i64 %div
19   %0 = load %struct.basket*, %struct.basket** %arrayidx, align 8
20   %abs_cost = getelementptr inbounds %struct.basket, %struct.basket* %0, i64 0, i32 2
21   %1 = load i64, i64* %abs_cost, align 8
22   br label %do.body
24 do.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
29 while.cond:
30   %l.1 = phi i64 [ %l.0, %do.body ], [ %inc, %while.body ]
31   %arrayidx1 = getelementptr inbounds [351 x %struct.basket*], [351 x %struct.basket*]* @perm, i64 0, i64 %l.1
32   %2 = load %struct.basket*, %struct.basket** %arrayidx1, align 8
33   %abs_cost2 = getelementptr inbounds %struct.basket, %struct.basket* %2, i64 0, i32 2
34   %3 = load i64, i64* %abs_cost2, align 8
35   %cmp = icmp sgt i64 %3, %1
36   br i1 %cmp, label %while.body, label %while.cond3
38 while.body:
39   %inc = add nsw i64 %l.1, 1
40   br label %while.cond
42 while.cond3:
43   %r.1 = phi i64 [ %r.0, %while.cond ], [ %dec, %while.body7 ]
44   %arrayidx4 = getelementptr inbounds [351 x %struct.basket*], [351 x %struct.basket*]* @perm, i64 0, i64 %r.1
45   %4 = load %struct.basket*, %struct.basket** %arrayidx4, align 8
46   %abs_cost5 = getelementptr inbounds %struct.basket, %struct.basket* %4, i64 0, i32 2
47   %5 = load i64, i64* %abs_cost5, align 8
48   %cmp6 = icmp sgt i64 %1, %5
49   br i1 %cmp6, label %while.body7, label %while.end8
51 while.body7:
52   %dec = add nsw i64 %r.1, -1
53   br label %while.cond3
55 while.end8:
56   %cmp9 = icmp slt i64 %l.1, %r.1
57   br i1 %cmp9, label %if.then, label %if.end
59 if.then:
60   %6 = bitcast %struct.basket** %arrayidx1 to i64*
61   %7 = load i64, i64* %6, align 8
62   store %struct.basket* %4, %struct.basket** %arrayidx1, align 8
63   %8 = bitcast %struct.basket** %arrayidx4 to i64*
64   store i64 %7, i64* %8, align 8
65   br label %if.end
67 if.end:
68   %cmp14 = icmp sgt i64 %l.1, %r.1
69   %not.cmp14 = xor i1 %cmp14, true
70   %9 = zext i1 %not.cmp14 to i64
71   %r.2 = sub i64 %r.1, %9
72   %not.cmp1457 = xor i1 %cmp14, true
73   %inc16 = zext i1 %not.cmp1457 to i64
74   %l.2 = add nsw i64 %l.1, %inc16
75   %cmp19 = icmp sgt i64 %l.2, %r.2
76   br i1 %cmp19, label %do.end, label %do.body
78 do.end:
79   %cmp20 = icmp sgt i64 %r.2, %min
80   br i1 %cmp20, label %if.then21, label %if.end22
82 if.then21:
83   call void @sort_basket(i64 %min, i64 %r.2)
84   br label %if.end22
86 if.end22:
87   %cmp23 = icmp slt i64 %l.2, %max
88   %cmp24 = icmp slt i64 %l.2, 51
89   %or.cond = and i1 %cmp23, %cmp24
90   br i1 %or.cond, label %if.then25, label %if.end26
92 if.then25:
93   call void @sort_basket(i64 %l.2, i64 %max)
94   br label %if.end26
96 if.end26:
97   ret void
100 ; CHECK: define dso_local void @sort_basket(i64 %min, i64 %max) #0 !prof [[ENTRY_COUNT:![0-9]+]]
101 ; CHECK: [[ENTRY_COUNT]] = !{!"function_entry_count", i64 12949310}