[llvm] [VPlan] Implement printing VPIRMetadata. (PR #165825)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 30 22:05:12 PDT 2025
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/165825
>From bcd6751e244e7af6eea67f64632a367027b53f3f Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Fri, 31 Oct 2025 04:34:53 +0000
Subject: [PATCH] [VPlan] Implement printing VPIRMetadata.
Implement and use debug printing for VPIRMetadata.
---
llvm/lib/Transforms/Vectorize/VPlan.h | 8 ++++++
.../lib/Transforms/Vectorize/VPlanRecipes.cpp | 26 +++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 1f10058ab4a9a..79583ce34c74d 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -968,6 +968,9 @@ class VPIRMetadata {
/// Intersect this VPIRMetada object with \p MD, keeping only metadata
/// nodes that are common to both.
void intersect(const VPIRMetadata &MD);
+
+ /// Print metadata with node IDs.
+ void print(raw_ostream &O, const Module &M) const;
};
/// This is a concrete Recipe that models a single VPlan-level instruction.
@@ -4268,6 +4271,11 @@ class VPlan {
/// Return the VPIRBasicBlock wrapping the header of the scalar loop.
VPIRBasicBlock *getScalarHeader() const { return ScalarHeader; }
+ /// Return the Module from the scalar header.
+ const Module &getModule() const {
+ return *ScalarHeader->getIRBasicBlock()->getModule();
+ }
+
/// Return an ArrayRef containing VPIRBasicBlocks wrapping the exit blocks of
/// the original scalar loop.
ArrayRef<VPIRBasicBlock *> getExitBlocks() const { return ExitBlocks; }
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index bde62dd6dd4bc..3feedafde8049 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -1443,6 +1443,7 @@ void VPInstruction::print(raw_ostream &O, const Twine &Indent,
printFlags(O);
printOperands(O, SlotTracker);
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
if (auto DL = getDebugLoc()) {
O << ", !dbg ";
@@ -1669,6 +1670,25 @@ void VPIRMetadata::intersect(const VPIRMetadata &Other) {
Metadata = std::move(MetadataIntersection);
}
+void VPIRMetadata::print(raw_ostream &O, const Module &M) const {
+ if (Metadata.empty())
+ return;
+
+ SmallVector<StringRef, 8> MDNames;
+ M.getContext().getMDKindNames(MDNames);
+
+ O << " (";
+ interleaveComma(Metadata, O, [&](const auto &KindNodePair) {
+ auto [Kind, Node] = KindNodePair;
+ assert(Kind != 0 && "Debug metadata should not be managed by VPIRMetadata");
+ assert(Kind < MDNames.size() && !MDNames[Kind].empty() &&
+ "Unexpected unnamed metadata kind");
+ O << "!" << MDNames[Kind] << " ";
+ Node->printAsOperand(O, &M);
+ });
+ O << ")";
+}
+
void VPWidenCallRecipe::execute(VPTransformState &State) {
assert(State.VF.isVector() && "not widening");
assert(Variant != nullptr && "Can't create vector function.");
@@ -1729,6 +1749,7 @@ void VPWidenCallRecipe::print(raw_ostream &O, const Twine &Indent,
Op->printAsOperand(O, SlotTracker);
});
O << ")";
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
O << " (using library function";
if (Variant->hasName())
@@ -1863,6 +1884,7 @@ void VPWidenIntrinsicRecipe::print(raw_ostream &O, const Twine &Indent,
Op->printAsOperand(O, SlotTracker);
});
O << ")";
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
}
#endif
@@ -2255,6 +2277,7 @@ void VPWidenRecipe::print(raw_ostream &O, const Twine &Indent,
O << " = " << Instruction::getOpcodeName(Opcode);
printFlags(O);
printOperands(O, SlotTracker);
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
}
#endif
@@ -2336,6 +2359,7 @@ void VPWidenCastRecipe::print(raw_ostream &O, const Twine &Indent,
printFlags(O);
printOperands(O, SlotTracker);
O << " to " << *getResultType();
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
}
#endif
@@ -3618,6 +3642,7 @@ void VPWidenLoadRecipe::print(raw_ostream &O, const Twine &Indent,
printAsOperand(O, SlotTracker);
O << " = load ";
printOperands(O, SlotTracker);
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
}
#endif
@@ -3739,6 +3764,7 @@ void VPWidenStoreRecipe::print(raw_ostream &O, const Twine &Indent,
VPSlotTracker &SlotTracker) const {
O << Indent << "WIDEN store ";
printOperands(O, SlotTracker);
+ VPIRMetadata::print(O, getParent()->getPlan()->getModule());
}
#endif
More information about the llvm-commits
mailing list