10abd7445SRong Xu; Note: Scaling the func entry count (using the sum of count value) so that BFI counter value is close to raw profile counter values. 20abd7445SRong Xu; RUN: llvm-profdata merge %S/Inputs/fix_bfi.proftext -o %t.profdata 3b5d884a3SFangrui Song; RUN: opt -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S -pgo-fix-entry-count=true < %s 2>&1 | FileCheck %s 40abd7445SRong Xu 50abd7445SRong Xutarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 60abd7445SRong Xutarget triple = "x86_64-unknown-linux-gnu" 70abd7445SRong Xu 89ff36df5SFangrui Song%struct.basket = type { ptr, i64, i64 } 99ff36df5SFangrui Song%struct.arc = type { i64, ptr, ptr, i32, ptr, ptr, i64, i64 } 109ff36df5SFangrui Song%struct.node = type { i64, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, i64, i32, i32 } 110abd7445SRong Xu 129ff36df5SFangrui Song@perm = internal unnamed_addr global [351 x ptr] zeroinitializer, align 16 130abd7445SRong Xu 140abd7445SRong Xudefine dso_local void @sort_basket(i64 %min, i64 %max) { 150abd7445SRong Xuentry: 160abd7445SRong Xu %add = add nsw i64 %min, %max 170abd7445SRong Xu %div = sdiv i64 %add, 2 189ff36df5SFangrui Song %arrayidx = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %div 199ff36df5SFangrui Song %0 = load ptr, ptr %arrayidx, align 8 209ff36df5SFangrui Song %abs_cost = getelementptr inbounds %struct.basket, ptr %0, i64 0, i32 2 219ff36df5SFangrui Song %1 = load i64, ptr %abs_cost, align 8 220abd7445SRong Xu br label %do.body 230abd7445SRong Xu 240abd7445SRong Xudo.body: 250abd7445SRong Xu %r.0 = phi i64 [ %max, %entry ], [ %r.2, %if.end ] 260abd7445SRong Xu %l.0 = phi i64 [ %min, %entry ], [ %l.2, %if.end ] 270abd7445SRong Xu br label %while.cond 280abd7445SRong Xu 290abd7445SRong Xuwhile.cond: 300abd7445SRong Xu %l.1 = phi i64 [ %l.0, %do.body ], [ %inc, %while.body ] 319ff36df5SFangrui Song %arrayidx1 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %l.1 329ff36df5SFangrui Song %2 = load ptr, ptr %arrayidx1, align 8 339ff36df5SFangrui Song %abs_cost2 = getelementptr inbounds %struct.basket, ptr %2, i64 0, i32 2 349ff36df5SFangrui Song %3 = load i64, ptr %abs_cost2, align 8 350abd7445SRong Xu %cmp = icmp sgt i64 %3, %1 360abd7445SRong Xu br i1 %cmp, label %while.body, label %while.cond3 370abd7445SRong Xu 380abd7445SRong Xuwhile.body: 390abd7445SRong Xu %inc = add nsw i64 %l.1, 1 400abd7445SRong Xu br label %while.cond 410abd7445SRong Xu 420abd7445SRong Xuwhile.cond3: 430abd7445SRong Xu %r.1 = phi i64 [ %r.0, %while.cond ], [ %dec, %while.body7 ] 449ff36df5SFangrui Song %arrayidx4 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %r.1 459ff36df5SFangrui Song %4 = load ptr, ptr %arrayidx4, align 8 469ff36df5SFangrui Song %abs_cost5 = getelementptr inbounds %struct.basket, ptr %4, i64 0, i32 2 479ff36df5SFangrui Song %5 = load i64, ptr %abs_cost5, align 8 480abd7445SRong Xu %cmp6 = icmp sgt i64 %1, %5 490abd7445SRong Xu br i1 %cmp6, label %while.body7, label %while.end8 500abd7445SRong Xu 510abd7445SRong Xuwhile.body7: 520abd7445SRong Xu %dec = add nsw i64 %r.1, -1 530abd7445SRong Xu br label %while.cond3 540abd7445SRong Xu 550abd7445SRong Xuwhile.end8: 560abd7445SRong Xu %cmp9 = icmp slt i64 %l.1, %r.1 570abd7445SRong Xu br i1 %cmp9, label %if.then, label %if.end 580abd7445SRong Xu 590abd7445SRong Xuif.then: 609ff36df5SFangrui Song %6 = load i64, ptr %arrayidx1, align 8 619ff36df5SFangrui Song store ptr %4, ptr %arrayidx1, align 8 629ff36df5SFangrui Song store i64 %6, ptr %arrayidx4, align 8 630abd7445SRong Xu br label %if.end 640abd7445SRong Xu 650abd7445SRong Xuif.end: 660abd7445SRong Xu %cmp14 = icmp sgt i64 %l.1, %r.1 670abd7445SRong Xu %not.cmp14 = xor i1 %cmp14, true 689ff36df5SFangrui Song %7 = zext i1 %not.cmp14 to i64 699ff36df5SFangrui Song %r.2 = sub i64 %r.1, %7 700abd7445SRong Xu %not.cmp1457 = xor i1 %cmp14, true 710abd7445SRong Xu %inc16 = zext i1 %not.cmp1457 to i64 720abd7445SRong Xu %l.2 = add nsw i64 %l.1, %inc16 730abd7445SRong Xu %cmp19 = icmp sgt i64 %l.2, %r.2 740abd7445SRong Xu br i1 %cmp19, label %do.end, label %do.body 750abd7445SRong Xu 760abd7445SRong Xudo.end: 770abd7445SRong Xu %cmp20 = icmp sgt i64 %r.2, %min 780abd7445SRong Xu br i1 %cmp20, label %if.then21, label %if.end22 790abd7445SRong Xu 800abd7445SRong Xuif.then21: 810abd7445SRong Xu call void @sort_basket(i64 %min, i64 %r.2) 820abd7445SRong Xu br label %if.end22 830abd7445SRong Xu 840abd7445SRong Xuif.end22: 850abd7445SRong Xu %cmp23 = icmp slt i64 %l.2, %max 860abd7445SRong Xu %cmp24 = icmp slt i64 %l.2, 51 870abd7445SRong Xu %or.cond = and i1 %cmp23, %cmp24 880abd7445SRong Xu br i1 %or.cond, label %if.then25, label %if.end26 890abd7445SRong Xu 900abd7445SRong Xuif.then25: 910abd7445SRong Xu call void @sort_basket(i64 %l.2, i64 %max) 920abd7445SRong Xu br label %if.end26 930abd7445SRong Xu 940abd7445SRong Xuif.end26: 950abd7445SRong Xu ret void 960abd7445SRong Xu} 970abd7445SRong Xu 980abd7445SRong Xu; CHECK: define dso_local void @sort_basket(i64 %min, i64 %max) #0 !prof [[ENTRY_COUNT:![0-9]+]] 99*e3cf80c5SMatthias Braun; CHECK: [[ENTRY_COUNT]] = !{!"function_entry_count", i64 13338888} 100