Skip to content

Conversation

ro-i
Copy link
Contributor

@ro-i ro-i commented Oct 12, 2025

No description provided.

@llvmbot
Copy link
Member

llvmbot commented Oct 12, 2025

@llvm/pr-subscribers-llvm-transforms

Author: Robert Imschweiler (ro-i)

Changes

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

3 Files Affected:

  • (modified) llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h (+3)
  • (modified) llvm/lib/Transforms/Utils/BasicBlockUtils.cpp (+7)
  • (modified) llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp (+24)
diff --git a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
index 979f3b3eb72ff..b53ac990fb40d 100644
--- a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
+++ b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
@@ -21,6 +21,7 @@
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Dominators.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/Printable.h"
 #include <cassert>
 
 namespace llvm {
@@ -611,6 +612,8 @@ LLVM_ABI void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder);
 // br/brcond/unreachable/ret
 LLVM_ABI bool hasOnlySimpleTerminator(const Function &F);
 
+LLVM_ABI Printable printBasicBlock(const BasicBlock *BB);
+
 } // end namespace llvm
 
 #endif // LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index c8255742c41ba..8a5cb3d0adaab 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -1775,3 +1775,10 @@ bool llvm::hasOnlySimpleTerminator(const Function &F) {
   }
   return true;
 }
+
+Printable llvm::printBasicBlock(const BasicBlock *BB) {
+  return Printable([BB](raw_ostream &OS) {
+    if (BB)
+      return BB->printAsOperand(OS);
+  });
+}
diff --git a/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp b/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
index 40a8c1d8d3da1..4a4aed8f1430d 100644
--- a/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
+++ b/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
@@ -716,3 +716,27 @@ attributes #0 = { presplitcoroutine }
   EXPECT_FALSE(llvm::isPresplitCoroSuspendExitEdge(
       *ExitN.getSinglePredecessor(), ExitN));
 }
+
+TEST(BasicBlockUtils, BasicBlockPrintable) {
+  std::string S;
+  llvm::raw_string_ostream OS{S};
+
+  LLVMContext C;
+  std::unique_ptr<Module> M = parseIR(C, R"IR(
+define void @foo() {
+.entry:
+  br label %bb0
+bb0:
+  ret void
+}
+)IR");
+
+  Function *F = M->getFunction("foo");
+  for (BasicBlock &BB : *F) {
+    OS << printBasicBlock(&BB);
+    EXPECT_EQ(OS.str(), "label %" + BB.getName().str());
+    S.clear();
+  }
+  OS << printBasicBlock(nullptr);
+  EXPECT_EQ(OS.str(), "");
+}

Copy link
Member

@Meinersbur Meinersbur left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ro-i ro-i merged commit 6fca138 into main Oct 22, 2025
10 checks passed
@ro-i ro-i deleted the users/ro-i/print-basic-block branch October 22, 2025 15:47
ro-i added a commit that referenced this pull request Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants