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

Aiden Grossman via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 29 11:17:05 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());
----------------
boomanaiden154 wrote:

That would produce the desired values and not break the abstraction, but it will change the precision of the result, returning a `float` instead of a `double`. Not sure how much that matters in practice, but the intention here seems to be to use a `double`.

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?

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


More information about the llvm-commits mailing list