Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Analysis / BlockFrequencyInfo / loops_with_profile_info.ll
blob35cc1d0111ee353fe9315205d6124b3c3835dfd1
1 ; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
3 ; This code contains three loops. One is triple-nested, the
4 ; second is double nested and the third is a single loop. At
5 ; runtime, all three loops execute 1,000,000 times each. We use to
6 ; give different frequencies to each of the loops because loop
7 ; scales were limited to no more than 4,096.
9 ; This was penalizing the hotness of the second and third loops
10 ; because BFI was reducing the loop scale for for.cond16 and
11 ; for.cond26 to a max of 4,096.
13 ; Without this restriction, all loops are now correctly given the same
14 ; frequency values.
16 ; Original C code:
19 ; int g;
20 ; __attribute__((noinline)) void bar() {
21 ;  g++;
22 ; }
24 ; extern int printf(const char*, ...);
26 ; int main()
27 ; {
28 ;   int i, j, k;
30 ;   g = 0;
31 ;   for (i = 0; i < 100; i++)
32 ;     for (j = 0; j < 100; j++)
33 ;        for (k = 0; k < 100; k++)
34 ;            bar();
36 ;   printf ("g = %d\n", g);
37 ;   g = 0;
39 ;   for (i = 0; i < 100; i++)
40 ;     for (j = 0; j < 10000; j++)
41 ;         bar();
43 ;   printf ("g = %d\n", g);
44 ;   g = 0;
47 ;   for (i = 0; i < 1000000; i++)
48 ;     bar();
50 ;   printf ("g = %d\n", g);
51 ;   g = 0;
52 ; }
54 @g = common global i32 0, align 4
55 @.str = private unnamed_addr constant [8 x i8] c"g = %d\0A\00", align 1
57 declare void @bar()
58 declare i32 @printf(ptr, ...)
60 ; CHECK: Printing analysis {{.*}} for function 'main':
61 ; CHECK-NEXT: block-frequency-info: main
62 define i32 @main() !prof !6 {
63 entry:
64   %retval = alloca i32, align 4
65   %i = alloca i32, align 4
66   %j = alloca i32, align 4
67   %k = alloca i32, align 4
68   store i32 0, ptr %retval
69   store i32 0, ptr @g, align 4
70   store i32 0, ptr %i, align 4
71   br label %for.cond
73 for.cond:                                         ; preds = %for.inc10, %entry
74   %0 = load i32, ptr %i, align 4
75   %cmp = icmp slt i32 %0, 100
76   br i1 %cmp, label %for.body, label %for.end12, !prof !1
78 for.body:                                         ; preds = %for.cond
79   store i32 0, ptr %j, align 4
80   br label %for.cond1
82 for.cond1:                                        ; preds = %for.inc7, %for.body
83   %1 = load i32, ptr %j, align 4
84   %cmp2 = icmp slt i32 %1, 100
85   br i1 %cmp2, label %for.body3, label %for.end9, !prof !2
87 for.body3:                                        ; preds = %for.cond1
88   store i32 0, ptr %k, align 4
89   br label %for.cond4
91 for.cond4:                                        ; preds = %for.inc, %for.body3
92   %2 = load i32, ptr %k, align 4
93   %cmp5 = icmp slt i32 %2, 100
94   br i1 %cmp5, label %for.body6, label %for.end, !prof !3
96 ; CHECK: - for.body6: float = 1000000.0,{{.*}}count = 1000000
97 for.body6:                                        ; preds = %for.cond4
98   call void @bar()
99   br label %for.inc
101 for.inc:                                          ; preds = %for.body6
102   %3 = load i32, ptr %k, align 4
103   %inc = add nsw i32 %3, 1
104   store i32 %inc, ptr %k, align 4
105   br label %for.cond4
107 for.end:                                          ; preds = %for.cond4
108   br label %for.inc7
110 for.inc7:                                         ; preds = %for.end
111   %4 = load i32, ptr %j, align 4
112   %inc8 = add nsw i32 %4, 1
113   store i32 %inc8, ptr %j, align 4
114   br label %for.cond1
116 for.end9:                                         ; preds = %for.cond1
117   br label %for.inc10
119 for.inc10:                                        ; preds = %for.end9
120   %5 = load i32, ptr %i, align 4
121   %inc11 = add nsw i32 %5, 1
122   store i32 %inc11, ptr %i, align 4
123   br label %for.cond
125 for.end12:                                        ; preds = %for.cond
126   %6 = load i32, ptr @g, align 4
127   %call = call i32 (ptr, ...) @printf(ptr @.str, i32 %6)
128   store i32 0, ptr @g, align 4
129   store i32 0, ptr %i, align 4
130   br label %for.cond13
132 for.cond13:                                       ; preds = %for.inc22, %for.end12
133   %7 = load i32, ptr %i, align 4
134   %cmp14 = icmp slt i32 %7, 100
135   br i1 %cmp14, label %for.body15, label %for.end24, !prof !1
137 for.body15:                                       ; preds = %for.cond13
138   store i32 0, ptr %j, align 4
139   br label %for.cond16
141 for.cond16:                                       ; preds = %for.inc19, %for.body15
142   %8 = load i32, ptr %j, align 4
143   %cmp17 = icmp slt i32 %8, 10000
144   br i1 %cmp17, label %for.body18, label %for.end21, !prof !4
146 ; CHECK: - for.body18: float = 999999.5,{{.*}}count = 1000000
147 for.body18:                                       ; preds = %for.cond16
148   call void @bar()
149   br label %for.inc19
151 for.inc19:                                        ; preds = %for.body18
152   %9 = load i32, ptr %j, align 4
153   %inc20 = add nsw i32 %9, 1
154   store i32 %inc20, ptr %j, align 4
155   br label %for.cond16
157 for.end21:                                        ; preds = %for.cond16
158   br label %for.inc22
160 for.inc22:                                        ; preds = %for.end21
161   %10 = load i32, ptr %i, align 4
162   %inc23 = add nsw i32 %10, 1
163   store i32 %inc23, ptr %i, align 4
164   br label %for.cond13
166 for.end24:                                        ; preds = %for.cond13
167   %11 = load i32, ptr @g, align 4
168   %call25 = call i32 (ptr, ...) @printf(ptr @.str, i32 %11)
169   store i32 0, ptr @g, align 4
170   store i32 0, ptr %i, align 4
171   br label %for.cond26
173 for.cond26:                                       ; preds = %for.inc29, %for.end24
174   %12 = load i32, ptr %i, align 4
175   %cmp27 = icmp slt i32 %12, 1000000
176   br i1 %cmp27, label %for.body28, label %for.end31, !prof !5
178 ; CHECK: - for.body28: float = 1000224.3,{{.*}}count = 1000224
179 for.body28:                                       ; preds = %for.cond26
180   call void @bar()
181   br label %for.inc29
183 for.inc29:                                        ; preds = %for.body28
184   %13 = load i32, ptr %i, align 4
185   %inc30 = add nsw i32 %13, 1
186   store i32 %inc30, ptr %i, align 4
187   br label %for.cond26
189 for.end31:                                        ; preds = %for.cond26
190   %14 = load i32, ptr @g, align 4
191   %call32 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14)
192   store i32 0, ptr @g, align 4
193   %15 = load i32, ptr %retval
194   ret i32 %15
197 !llvm.ident = !{!0}
199 !0 = !{!"clang version 3.7.0 (trunk 232635) (llvm/trunk 232636)"}
200 !1 = !{!"branch_weights", i32 100, i32 1}
201 !2 = !{!"branch_weights", i32 10000, i32 100}
202 !3 = !{!"branch_weights", i32 1000000, i32 10000}
203 !4 = !{!"branch_weights", i32 1000000, i32 100}
204 !5 = !{!"branch_weights", i32 1000000, i32 1}
205 !6 = !{!"function_entry_count", i32 1}