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