104 lines · plain
1; Note: Verify bfi counter after loading the profile.2; RUN: llvm-profdata merge %S/Inputs/bfi_verification.proftext -o %t.profdata3; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S -pgo-verify-bfi-ratio=2 -pgo-verify-bfi=true -pgo-fix-entry-count=false -pass-remarks-analysis=pgo 2>&1 | FileCheck %s --check-prefix=THRESHOLD-CHECK4; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S -pgo-verify-hot-bfi=true -pgo-fix-entry-count=false -pass-remarks-analysis=pgo 2>&1 | FileCheck %s --check-prefix=HOTONLY-CHECK5 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"7target triple = "x86_64-unknown-linux-gnu"8 9%struct.basket = type { ptr, i64, i64 }10%struct.arc = type { i64, ptr, ptr, i32, ptr, ptr, i64, i64 }11%struct.node = type { i64, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, i64, i32, i32 }12 13@perm = internal unnamed_addr global [351 x ptr] zeroinitializer, align 1614 15define dso_local void @sort_basket(i64 %min, i64 %max) {16entry:17 %add = add nsw i64 %min, %max18 %div = sdiv i64 %add, 219 %arrayidx = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %div20 %0 = load ptr, ptr %arrayidx, align 821 %abs_cost = getelementptr inbounds %struct.basket, ptr %0, i64 0, i32 222 %1 = load i64, ptr %abs_cost, align 823 br label %do.body24 25do.body:26 %r.0 = phi i64 [ %max, %entry ], [ %r.2, %if.end ]27 %l.0 = phi i64 [ %min, %entry ], [ %l.2, %if.end ]28 br label %while.cond29 30while.cond:31 %l.1 = phi i64 [ %l.0, %do.body ], [ %inc, %while.body ]32 %arrayidx1 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %l.133 %2 = load ptr, ptr %arrayidx1, align 834 %abs_cost2 = getelementptr inbounds %struct.basket, ptr %2, i64 0, i32 235 %3 = load i64, ptr %abs_cost2, align 836 %cmp = icmp sgt i64 %3, %137 br i1 %cmp, label %while.body, label %while.cond338 39while.body:40 %inc = add nsw i64 %l.1, 141 br label %while.cond42 43while.cond3:44 %r.1 = phi i64 [ %r.0, %while.cond ], [ %dec, %while.body7 ]45 %arrayidx4 = getelementptr inbounds [351 x ptr], ptr @perm, i64 0, i64 %r.146 %4 = load ptr, ptr %arrayidx4, align 847 %abs_cost5 = getelementptr inbounds %struct.basket, ptr %4, i64 0, i32 248 %5 = load i64, ptr %abs_cost5, align 849 %cmp6 = icmp sgt i64 %1, %550 br i1 %cmp6, label %while.body7, label %while.end851 52while.body7:53 %dec = add nsw i64 %r.1, -154 br label %while.cond355 56while.end8:57 %cmp9 = icmp slt i64 %l.1, %r.158 br i1 %cmp9, label %if.then, label %if.end59 60if.then:61 %6 = load i64, ptr %arrayidx1, align 862 store ptr %4, ptr %arrayidx1, align 863 store i64 %6, ptr %arrayidx4, align 864 br label %if.end65 66if.end:67 %cmp14 = icmp sgt i64 %l.1, %r.168 %not.cmp14 = xor i1 %cmp14, true69 %7 = zext i1 %not.cmp14 to i6470 %r.2 = sub i64 %r.1, %771 %not.cmp1457 = xor i1 %cmp14, true72 %inc16 = zext i1 %not.cmp1457 to i6473 %l.2 = add nsw i64 %l.1, %inc1674 %cmp19 = icmp sgt i64 %l.2, %r.275 br i1 %cmp19, label %do.end, label %do.body76 77do.end:78 %cmp20 = icmp sgt i64 %r.2, %min79 br i1 %cmp20, label %if.then21, label %if.end2280 81if.then21:82 call void @sort_basket(i64 %min, i64 %r.2)83 br label %if.end2284 85if.end22:86 %cmp23 = icmp slt i64 %l.2, %max87 %cmp24 = icmp slt i64 %l.2, 5188 %or.cond = and i1 %cmp23, %cmp2489 br i1 %or.cond, label %if.then25, label %if.end2690 91if.then25:92 call void @sort_basket(i64 %l.2, i64 %max)93 br label %if.end2694 95if.end26:96 ret void97}98; THRESHOLD-CHECK: remark: <unknown>:0:0: BB while.body7 Count=77 BFI_Count=184577899; THRESHOLD-CHECK: remark: <unknown>:0:0: BB if.then21 Count=2 BFI_Count=621100; THRESHOLD-CHECK: remark: <unknown>:0:0: In Func sort_basket: Num_of_BB=14, Num_of_non_zerovalue_BB=14, Num_of_mis_matching_BB=2101; TODO: I am not sure how to reproduce the situation of hot/cold switching: We currently choose102; factors in `convertFloatingToInteger` so precision is kept at high end, so hot blocks should stay hot.103; HOTONLY-CHECK: {{.*}}104