bool ProfileSummaryInfo::isColdBlock(const BasicBlock *BB,
BlockFrequencyInfo *BFI) {
auto Count = BFI->getBlockProfileCount(BB);
- return Count && isColdCount(*Count);
+ if (Count)
+ return isColdCount(*Count);
+ if (!hasSampleProfile())
+ return false;
+
+ const Function *F = BB->getParent();
+ return ProfileSampleAccurate ||
+ (F && F->hasFnAttribute("profile-sample-accurate"));
}
bool ProfileSummaryInfo::isHotCallSite(const CallSite &CS,
; RUN: opt < %s -codegenprepare -S | FileCheck %s
+; RUN: opt < %s -codegenprepare -profile-sample-accurate -S | FileCheck %s --check-prefix ACCURATE
target triple = "x86_64-pc-linux-gnu"
; This tests that hot/cold functions get correct section prefix assigned
; CHECK: hot_func{{.*}}!section_prefix ![[HOT_ID:[0-9]+]]
+; ACCURATE: hot_func{{.*}}!section_prefix ![[HOT_ID:[0-9]+]]
; The entry is hot
define void @hot_func() !prof !15 {
ret void
}
; CHECK: hot_call_func{{.*}}!section_prefix ![[HOT_ID]]
+; ACCURATE: hot_call_func{{.*}}!section_prefix ![[HOT_ID]]
; The sum of 2 callsites are hot
define void @hot_call_func() !prof !16 {
call void @hot_func(), !prof !17
}
; CHECK-NOT: normal_func{{.*}}!section_prefix
+; ACCURATE-NOT: normal_func{{.*}}!section_prefix
; The sum of all callsites are neither hot or cold
define void @normal_func() !prof !16 {
call void @hot_func(), !prof !17
}
; CHECK: cold_func{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
+; ACCURATE: cold_func{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
; The entry and the callsite are both cold
define void @cold_func() !prof !16 {
call void @hot_func(), !prof !18
ret void
}
+
+; CHECK-NOT: foo_not_in_profile{{.*}}!section_prefix
+; The function not appearing in profile is neither hot nor cold
+;
+; ACCURATE: foo_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
+; The function not appearing in profile is cold when -profile-sample-accurate
+; is on
+define void @foo_not_in_profile() !prof !19 {
+ call void @hot_func()
+ ret void
+}
+
+; CHECK: bar_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
+; ACCURATE: bar_not_in_profile{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
+; The function not appearing in profile is cold when the func has
+; profile-sample-accurate attribute
+define void @bar_not_in_profile() #0 !prof !19 {
+ call void @hot_func()
+ ret void
+}
+
+attributes #0 = { "profile-sample-accurate" }
+
; CHECK: ![[HOT_ID]] = !{!"function_section_prefix", !".hot"}
; CHECK: ![[COLD_ID]] = !{!"function_section_prefix", !".unlikely"}
!llvm.module.flags = !{!1}
!16 = !{!"function_entry_count", i64 1}
!17 = !{!"branch_weights", i32 80}
!18 = !{!"branch_weights", i32 1}
+!19 = !{!"function_entry_count", i64 -1}