[llvm] [BOLT] Fix heatmap with external addresses (PR #203479)

Amir Ayupov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 12 01:15:29 PDT 2026


https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/203479

External samples (X:0) were breaking heatmap printing, e.g.

  0x00000000: O0x00000000: ........

Explicitly track \p IsFirst instead of relying on zero.

Test Plan:
updated heatmap-preagg.test

Differential Revision: https://phabricator.intern.facebook.com/D103550522


>From 1447c0fe85fa3ba1b20377f9d787a11b29a442e6 Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Fri, 12 Jun 2026 01:08:39 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.8-beta.1
---
 bolt/lib/Profile/Heatmap.cpp      | 12 +++++++-----
 bolt/test/X86/heatmap-preagg.test | 13 +++++++++++++
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/bolt/lib/Profile/Heatmap.cpp b/bolt/lib/Profile/Heatmap.cpp
index 6da5264d0e597..deed04d0f982c 100644
--- a/bolt/lib/Profile/Heatmap.cpp
+++ b/bolt/lib/Profile/Heatmap.cpp
@@ -116,7 +116,7 @@ void Heatmap::print(raw_ostream &OS) const {
 
     changeColor(DefaultColor);
     finishLine(Start);
-    Start = alignTo(Start, BytesPerLine);
+    Start = alignTo(Start + BucketSize, BytesPerLine);
 
     uint64_t NumEmptyLines = (End - Start) / BytesPerLine;
 
@@ -216,6 +216,7 @@ void Heatmap::print(raw_ostream &OS) const {
 
   auto SectionStart = TextSections.begin();
   uint64_t PrevAddress = 0;
+  bool IsFirst = true;
   for (auto MI = Map.begin(), ME = Map.end(); MI != ME; ++MI) {
     const std::pair<const uint64_t, uint64_t> &Entry = *MI;
     uint64_t Address = Entry.first * BucketSize;
@@ -233,17 +234,18 @@ void Heatmap::print(raw_ostream &OS) const {
       Character = 'a' + ((Section - TextSections.begin()) % 26);
     }
 
-    if (PrevAddress)
-      fillRange(PrevAddress, Address);
-    else
+    if (IsFirst)
       startLine(Address);
+    else
+      fillRange(PrevAddress, Address);
 
     printValue(Entry.second, Character, /*ResetColor=*/false);
 
     PrevAddress = Address;
+    IsFirst = false;
   }
 
-  if (PrevAddress) {
+  if (!IsFirst) {
     changeColor(DefaultColor);
     finishLine(PrevAddress);
   }
diff --git a/bolt/test/X86/heatmap-preagg.test b/bolt/test/X86/heatmap-preagg.test
index 4c46be4948951..c47083b6e04a6 100644
--- a/bolt/test/X86/heatmap-preagg.test
+++ b/bolt/test/X86/heatmap-preagg.test
@@ -11,6 +11,11 @@ RUN: FileCheck %s --check-prefix CHECK-HM-64 --input-file %t
 RUN: FileCheck %s --check-prefix CHECK-HM-128 --input-file %t-128
 RUN: FileCheck %s --check-prefix CHECK-HM-1024 --input-file %t-1024
 
+RUN: split-file %s %t.inputs
+RUN: llvm-bolt-heatmap %t.exe -o %t.ext --pa \
+RUN:   -p %t.inputs/external.preagg --block-size=4096 --line-size=64
+RUN: FileCheck %s --check-prefix CHECK-HM-EXTERNAL --input-file %t.ext
+
 ## BOLTed input binary
 RUN: llvm-bolt %t.exe -o %t.out --pa -p %p/Inputs/blarge_new.preagg.txt \
 RUN:   --reorder-blocks=ext-tsp --split-functions --split-strategy=cdsplit \
@@ -68,6 +73,10 @@ CHECK-HM-1024-NEXT: 048c048c048c048c048c048c048c048c048c048c048c048c048c048c048c
 CHECK-HM-1024-NEXT: 0
 CHECK-HM-1024-NEXT: 0
 
+CHECK-HM-EXTERNAL: 0x00000000: o...............................................................
+CHECK-HM-EXTERNAL-NOT: 0x00000000:
+CHECK-HM-EXTERNAL: 0x00400000: .
+
 CHECK-BAT-HM-64: (349, 1126]
 CHECK-BAT-HM-4K: (605, 2182]
 
@@ -89,3 +98,7 @@ CHECK-SEC-HOT-BAT-NEXT: .text.cold, 0x800300, 0x800415, 0.0000, 0.0000, 0.0000
 CHECK-SEC-HOT-BAT-NEXT: [hot text], 0x800000, 0x8002cc, 38.7595, 91.6667, 0.3553
 CHECK-HOT-SYMS: 800000 W __hot_start
 CHECK-HOT-SYMS: 8002cc W __hot_end
+
+#--- external.preagg
+S X:0 1
+S 401000 6



More information about the llvm-commits mailing list