brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 35cc1d0 Raw
206 lines · plain
1; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s2 3; This code contains three loops. One is triple-nested, the4; second is double nested and the third is a single loop. At5; runtime, all three loops execute 1,000,000 times each. We use to6; give different frequencies to each of the loops because loop7; scales were limited to no more than 4,096.8;9; This was penalizing the hotness of the second and third loops10; because BFI was reducing the loop scale for for.cond16 and11; for.cond26 to a max of 4,096.12;13; Without this restriction, all loops are now correctly given the same14; frequency values.15;16; Original C code:17;18;19; int g;20; __attribute__((noinline)) void bar() {21;  g++;22; }23;24; extern int printf(const char*, ...);25;26; int main()27; {28;   int i, j, k;29;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();35;36;   printf ("g = %d\n", g);37;   g = 0;38;39;   for (i = 0; i < 100; i++)40;     for (j = 0; j < 10000; j++)41;         bar();42;43;   printf ("g = %d\n", g);44;   g = 0;45;46;47;   for (i = 0; i < 1000000; i++)48;     bar();49;50;   printf ("g = %d\n", g);51;   g = 0;52; }53 54@g = common global i32 0, align 455@.str = private unnamed_addr constant [8 x i8] c"g = %d\0A\00", align 156 57declare void @bar()58declare i32 @printf(ptr, ...)59 60; CHECK: Printing analysis {{.*}} for function 'main':61; CHECK-NEXT: block-frequency-info: main62define i32 @main() !prof !6 {63entry:64  %retval = alloca i32, align 465  %i = alloca i32, align 466  %j = alloca i32, align 467  %k = alloca i32, align 468  store i32 0, ptr %retval69  store i32 0, ptr @g, align 470  store i32 0, ptr %i, align 471  br label %for.cond72 73for.cond:                                         ; preds = %for.inc10, %entry74  %0 = load i32, ptr %i, align 475  %cmp = icmp slt i32 %0, 10076  br i1 %cmp, label %for.body, label %for.end12, !prof !177 78for.body:                                         ; preds = %for.cond79  store i32 0, ptr %j, align 480  br label %for.cond181 82for.cond1:                                        ; preds = %for.inc7, %for.body83  %1 = load i32, ptr %j, align 484  %cmp2 = icmp slt i32 %1, 10085  br i1 %cmp2, label %for.body3, label %for.end9, !prof !286 87for.body3:                                        ; preds = %for.cond188  store i32 0, ptr %k, align 489  br label %for.cond490 91for.cond4:                                        ; preds = %for.inc, %for.body392  %2 = load i32, ptr %k, align 493  %cmp5 = icmp slt i32 %2, 10094  br i1 %cmp5, label %for.body6, label %for.end, !prof !395 96; CHECK: - for.body6: float = 1000000.0,{{.*}}count = 100000097for.body6:                                        ; preds = %for.cond498  call void @bar()99  br label %for.inc100 101for.inc:                                          ; preds = %for.body6102  %3 = load i32, ptr %k, align 4103  %inc = add nsw i32 %3, 1104  store i32 %inc, ptr %k, align 4105  br label %for.cond4106 107for.end:                                          ; preds = %for.cond4108  br label %for.inc7109 110for.inc7:                                         ; preds = %for.end111  %4 = load i32, ptr %j, align 4112  %inc8 = add nsw i32 %4, 1113  store i32 %inc8, ptr %j, align 4114  br label %for.cond1115 116for.end9:                                         ; preds = %for.cond1117  br label %for.inc10118 119for.inc10:                                        ; preds = %for.end9120  %5 = load i32, ptr %i, align 4121  %inc11 = add nsw i32 %5, 1122  store i32 %inc11, ptr %i, align 4123  br label %for.cond124 125for.end12:                                        ; preds = %for.cond126  %6 = load i32, ptr @g, align 4127  %call = call i32 (ptr, ...) @printf(ptr @.str, i32 %6)128  store i32 0, ptr @g, align 4129  store i32 0, ptr %i, align 4130  br label %for.cond13131 132for.cond13:                                       ; preds = %for.inc22, %for.end12133  %7 = load i32, ptr %i, align 4134  %cmp14 = icmp slt i32 %7, 100135  br i1 %cmp14, label %for.body15, label %for.end24, !prof !1136 137for.body15:                                       ; preds = %for.cond13138  store i32 0, ptr %j, align 4139  br label %for.cond16140 141for.cond16:                                       ; preds = %for.inc19, %for.body15142  %8 = load i32, ptr %j, align 4143  %cmp17 = icmp slt i32 %8, 10000144  br i1 %cmp17, label %for.body18, label %for.end21, !prof !4145 146; CHECK: - for.body18: float = 999999.5,{{.*}}count = 1000000147for.body18:                                       ; preds = %for.cond16148  call void @bar()149  br label %for.inc19150 151for.inc19:                                        ; preds = %for.body18152  %9 = load i32, ptr %j, align 4153  %inc20 = add nsw i32 %9, 1154  store i32 %inc20, ptr %j, align 4155  br label %for.cond16156 157for.end21:                                        ; preds = %for.cond16158  br label %for.inc22159 160for.inc22:                                        ; preds = %for.end21161  %10 = load i32, ptr %i, align 4162  %inc23 = add nsw i32 %10, 1163  store i32 %inc23, ptr %i, align 4164  br label %for.cond13165 166for.end24:                                        ; preds = %for.cond13167  %11 = load i32, ptr @g, align 4168  %call25 = call i32 (ptr, ...) @printf(ptr @.str, i32 %11)169  store i32 0, ptr @g, align 4170  store i32 0, ptr %i, align 4171  br label %for.cond26172 173for.cond26:                                       ; preds = %for.inc29, %for.end24174  %12 = load i32, ptr %i, align 4175  %cmp27 = icmp slt i32 %12, 1000000176  br i1 %cmp27, label %for.body28, label %for.end31, !prof !5177 178; CHECK: - for.body28: float = 1000224.3,{{.*}}count = 1000224179for.body28:                                       ; preds = %for.cond26180  call void @bar()181  br label %for.inc29182 183for.inc29:                                        ; preds = %for.body28184  %13 = load i32, ptr %i, align 4185  %inc30 = add nsw i32 %13, 1186  store i32 %inc30, ptr %i, align 4187  br label %for.cond26188 189for.end31:                                        ; preds = %for.cond26190  %14 = load i32, ptr @g, align 4191  %call32 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14)192  store i32 0, ptr @g, align 4193  %15 = load i32, ptr %retval194  ret i32 %15195}196 197!llvm.ident = !{!0}198 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}206