[llvm-branch-commits] [CodeGen] Add Printer pass for MachineBlockHashInfo and tests (PR #192911)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Apr 20 01:15:40 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Vitaly Buka (vitalybuka)

<details>
<summary>Changes</summary>

Mostly AI generated.


---
Full diff: https://github.com/llvm/llvm-project/pull/192911.diff


5 Files Affected:

- (modified) llvm/include/llvm/CodeGen/Passes.h (+4) 
- (modified) llvm/include/llvm/InitializePasses.h (+1) 
- (modified) llvm/lib/CodeGen/CodeGen.cpp (+1) 
- (modified) llvm/lib/CodeGen/MachineBlockHashInfo.cpp (+46) 
- (added) llvm/test/CodeGen/X86/machine-block-hash.mir (+68) 


``````````diff
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h
index d9cfe065ffbec..f492401d1e9f9 100644
--- a/llvm/include/llvm/CodeGen/Passes.h
+++ b/llvm/include/llvm/CodeGen/Passes.h
@@ -80,6 +80,10 @@ LLVM_ABI MachineFunctionPass *createInsertCodePrefetchPass();
 /// createMachineBlockHashInfoPass - This pass computes basic block hashes.
 LLVM_ABI MachineFunctionPass *createMachineBlockHashInfoPass();
 
+/// createMachineBlockHashInfoPrinterPass - This pass prints basic block hashes.
+LLVM_ABI MachineFunctionPass *
+createMachineBlockHashInfoPrinterPass(raw_ostream &OS);
+
 /// createMachineFunctionSplitterPass - This pass splits machine functions
 /// using profile information.
 LLVM_ABI MachineFunctionPass *createMachineFunctionSplitterPass();
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 012f1fb0ebd90..d6aa67bbc5295 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -65,6 +65,7 @@ LLVM_ABI void initializeBarrierNoopPass(PassRegistry &);
 LLVM_ABI void initializeBasicAAWrapperPassPass(PassRegistry &);
 LLVM_ABI void initializeBlockFrequencyInfoWrapperPassPass(PassRegistry &);
 LLVM_ABI void initializeMachineBlockHashInfoPass(PassRegistry &);
+LLVM_ABI void initializeMachineBlockHashInfoPrinterPass(PassRegistry &);
 LLVM_ABI void initializeBranchFolderLegacyPass(PassRegistry &);
 LLVM_ABI void initializeBranchProbabilityInfoWrapperPassPass(PassRegistry &);
 LLVM_ABI void initializeBranchRelaxationLegacyPass(PassRegistry &);
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index bb8bbc4f44eed..2a5bd5f427af3 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -83,6 +83,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
   initializeMIRProfileLoaderPassPass(Registry);
   initializeMachineBlockFrequencyInfoWrapperPassPass(Registry);
   initializeMachineBlockHashInfoPass(Registry);
+  initializeMachineBlockHashInfoPrinterPass(Registry);
   initializeMachineBlockPlacementLegacyPass(Registry);
   initializeMachineBlockPlacementStatsLegacyPass(Registry);
   initializeMachineBranchProbabilityInfoWrapperPassPass(Registry);
diff --git a/llvm/lib/CodeGen/MachineBlockHashInfo.cpp b/llvm/lib/CodeGen/MachineBlockHashInfo.cpp
index eeddaf6d48de4..5b0569cbdba26 100644
--- a/llvm/lib/CodeGen/MachineBlockHashInfo.cpp
+++ b/llvm/lib/CodeGen/MachineBlockHashInfo.cpp
@@ -12,9 +12,11 @@
 
 #include "llvm/CodeGen/MachineBlockHashInfo.h"
 #include "llvm/ADT/Hashing.h"
+#include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineStableHash.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/InitializePasses.h"
+#include "llvm/Support/raw_ostream.h"
 #include "llvm/Target/TargetMachine.h"
 
 using namespace llvm;
@@ -44,9 +46,48 @@ static uint16_t fold_64_to_16(const uint64_t Value) {
   return Res;
 }
 
+namespace {
+class MachineBlockHashInfoPrinter : public MachineFunctionPass {
+  raw_ostream &OS;
+
+public:
+  static char ID;
+  MachineBlockHashInfoPrinter() : MachineFunctionPass(ID), OS(errs()) {}
+  MachineBlockHashInfoPrinter(raw_ostream &OS)
+      : MachineFunctionPass(ID), OS(OS) {}
+
+  StringRef getPassName() const override {
+    return "Machine Block Hash Info Printer";
+  }
+
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+    AU.setPreservesAll();
+    AU.addRequired<MachineBlockHashInfo>();
+    MachineFunctionPass::getAnalysisUsage(AU);
+  }
+
+  bool runOnMachineFunction(MachineFunction &MF) override {
+    MachineBlockHashInfo &MBHI = getAnalysis<MachineBlockHashInfo>();
+    OS << "Machine Block Hash Info for function: " << MF.getName() << "\n";
+    for (const auto &MBB : MF) {
+      OS << "  BB#" << MBB.getNumber() << ": "
+         << format_hex(MBHI.getMBBHash(MBB), 16) << "\n";
+    }
+    return false;
+  }
+};
+char MachineBlockHashInfoPrinter::ID = 0;
+} // end anonymous namespace
+
 INITIALIZE_PASS(MachineBlockHashInfo, "machine-block-hash",
                 "Machine Block Hash Analysis", true, true)
 
+INITIALIZE_PASS_BEGIN(MachineBlockHashInfoPrinter, "print-machine-block-hash",
+                      "Machine Block Hash Info Printer", true, true)
+INITIALIZE_PASS_DEPENDENCY(MachineBlockHashInfo)
+INITIALIZE_PASS_END(MachineBlockHashInfoPrinter, "print-machine-block-hash",
+                    "Machine Block Hash Info Printer", true, true)
+
 char MachineBlockHashInfo::ID = 0;
 
 MachineBlockHashInfo::MachineBlockHashInfo() : MachineFunctionPass(ID) {}
@@ -114,3 +155,8 @@ uint64_t MachineBlockHashInfo::getMBBHash(const MachineBasicBlock &MBB) {
 MachineFunctionPass *llvm::createMachineBlockHashInfoPass() {
   return new MachineBlockHashInfo();
 }
+
+MachineFunctionPass *
+llvm::createMachineBlockHashInfoPrinterPass(raw_ostream &OS) {
+  return new MachineBlockHashInfoPrinter(OS);
+}
\ No newline at end of file
diff --git a/llvm/test/CodeGen/X86/machine-block-hash.mir b/llvm/test/CodeGen/X86/machine-block-hash.mir
new file mode 100644
index 0000000000000..36a6909ea179d
--- /dev/null
+++ b/llvm/test/CodeGen/X86/machine-block-hash.mir
@@ -0,0 +1,68 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=x86_64-pc-linux -run-pass=print-machine-block-hash -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=HASH
+
+--- |
+  define void @foo() {
+    ret void
+  }
+  define void @func_mbb() {
+    ret void
+  }
+  define void @func_global() {
+    ret void
+  }
+  define void @func_fp() {
+    ret void
+  }
+...
+---
+name:            foo
+body:             |
+  ; HASH-LABEL: Machine Block Hash Info for function: foo
+  ; HASH-NEXT:  BB#0: 0xa6e9dab7a6e90002
+  ; HASH-NEXT:  BB#1: 0xa6e912e7a6e90002
+  bb.0:
+    $eax = MOV32ri 1
+    RET 0
+
+  bb.1:
+    $eax = MOV32ri 2
+    RET 0
+...
+---
+name:            func_mbb
+body:             |
+  ; HASH-LABEL: Machine Block Hash Info for function: func_mbb
+  ; HASH-NEXT:  BB#0: 0x60fdab7a6e90002
+  ; HASH-NEXT:  BB#1: 0x60f12e7a6e90002
+  bb.0:
+    successors: %bb.1
+    $eax = MOV32ri 1
+    JMP_1 %bb.1
+
+  bb.1:
+    $eax = MOV32ri 2
+    RET 0
+...
+---
+name:            func_global
+body:             |
+  ; HASH-LABEL: Machine Block Hash Info for function: func_global
+  ; HASH-NEXT:  BB#0: 0xcc1bf164cc1b0002
+  bb.0:
+    $rax = MOV64rm $rip, 1, $noreg, @foo, $noreg
+    RET 0
+...
+---
+name:            func_fp
+body:             |
+  ; HASH-LABEL: Machine Block Hash Info for function: func_fp
+  ; HASH-NEXT:  BB#0: 0x9d668f2d9d660002
+  bb.0:
+    $xmm0 = MOVSSrm $rip, 1, $noreg, %const.0, $noreg
+    RET 0
+constants:
+  - id:              0
+    value:           'float 1.000000e+00'
+    alignment:       4
+...

``````````

</details>


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


More information about the llvm-branch-commits mailing list