xref: /llvm-project/llvm/test/Transforms/PGOProfile/fix_bfi.ll (revision e3cf80c5c1fe55efd8216575ccadea0ab087e79c)
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