[llvm] [AsmPrint] Correctly factor function entry count when dumping MBB frequencies (PR #67826)

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 29 11:33:55 PDT 2023


================
@@ -1929,18 +1929,35 @@ void AsmPrinter::emitFunctionBody() {
 
   // Output MBB ids, function names, and frequencies if the flag to dump
   // MBB profile information has been set
-  if (MBBProfileDumpFileOutput) {
+  if (MBBProfileDumpFileOutput && !MF->empty()) {
     if (!MF->hasBBLabels())
       MF->getContext().reportError(
           SMLoc(),
           "Unable to find BB labels for MBB profile dump. -mbb-profile-dump "
           "must be called with -basic-block-sections=labels");
     MachineBlockFrequencyInfo &MBFI =
         getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI();
+    // The entry count and the entry basic block frequency aren't the same. We
+    // want to capture "absolute" frequencies, i.e. the frequency with which a
+    // MBB is executed when the program is executed - from there, we can derive
+    // Function-relative frequencies (divide by the value for the first MBB),
+    // and we also have the information about frequency with which functions
+    // were called. This helps, for example, in a type of integration tests
+    // where we want to cross-validate the compiler's profile with a real
+    // profile.
+    // Using double precision because uint64 values used to encode mbb
+    // "frequencies" may be quite large.
+    const double EntryCount =
+        static_cast<double>(MF->getFunction().getEntryCount()->getCount());
+    const double EntryFrequency =
+        static_cast<double>(MBFI.getBlockFreq(&*MF->begin()).getFrequency());
----------------
MatzeB wrote:

> Also, if we want to preserve this abstraction, maybe we mark getFrequency() as private and use friend classes where necessary to make the API easier to use, depending upon how the implementation here ends up going?

I don't think we are in a position to enforce this (there is a lot of `getFrequency()` users around), but I'll try to ask for it in reviews of new code when I see it...

https://github.com/llvm/llvm-project/pull/67826


More information about the llvm-commits mailing list