[llvm] [IR][PGO] Verify the structure of `VP` metadata. (PR #145584)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 27 14:58:53 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Mircea Trofin (mtrofin)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/145584.diff
3 Files Affected:
- (modified) llvm/include/llvm/IR/ProfDataUtils.h (+3)
- (modified) llvm/lib/IR/ProfDataUtils.cpp (+1-1)
- (modified) llvm/lib/IR/Verifier.cpp (+16-2)
``````````diff
diff --git a/llvm/include/llvm/IR/ProfDataUtils.h b/llvm/include/llvm/IR/ProfDataUtils.h
index 5c0e08b03c245..c24b2aa19a407 100644
--- a/llvm/include/llvm/IR/ProfDataUtils.h
+++ b/llvm/include/llvm/IR/ProfDataUtils.h
@@ -35,6 +35,9 @@ LLVM_ABI bool hasProfMD(const Instruction &I);
/// Checks if an MDNode contains Branch Weight Metadata
LLVM_ABI bool isBranchWeightMD(const MDNode *ProfileData);
+/// Checks if an MDNode contains value profiling Metadata
+LLVM_ABI bool isValueProfileMD(const MDNode *ProfileData);
+
/// Checks if an instructions has Branch Weight Metadata
///
/// \param I The instruction to check
diff --git a/llvm/lib/IR/ProfDataUtils.cpp b/llvm/lib/IR/ProfDataUtils.cpp
index 740023ca6d23b..605208edda70a 100644
--- a/llvm/lib/IR/ProfDataUtils.cpp
+++ b/llvm/lib/IR/ProfDataUtils.cpp
@@ -103,7 +103,7 @@ bool isBranchWeightMD(const MDNode *ProfileData) {
return isTargetMD(ProfileData, MDProfLabels::BranchWeights, MinBWOps);
}
-static bool isValueProfileMD(const MDNode *ProfileData) {
+bool isValueProfileMD(const MDNode *ProfileData) {
return isTargetMD(ProfileData, MDProfLabels::ValueProfile, MinVPOps);
}
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 9cab88b09779a..26d3b8b49598b 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -112,6 +112,7 @@
#include "llvm/IR/Value.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
+#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/AMDGPUAddrSpace.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
@@ -5026,9 +5027,22 @@ void Verifier::visitProfMetadata(Instruction &I, MDNode *MD) {
Check(mdconst::dyn_extract<ConstantInt>(MDO),
"!prof brunch_weights operand is not a const int");
}
+ } else if (ProfName == MDProfLabels::ValueProfile) {
+ Check(isValueProfileMD(MD),"invalid value profiling metadata",MD);
+ ConstantInt *KindInt = mdconst::dyn_extract<ConstantInt>(MD->getOperand(1));
+ Check(KindInt, "VP !prof missing kind argument", MD);
+
+ auto Kind = KindInt->getZExtValue();
+ Check(Kind >= InstrProfValueKind::IPVK_First &&
+ Kind <= InstrProfValueKind::IPVK_Last,
+ "Invalid VP !prof kind", MD);
+ if (Kind == InstrProfValueKind::IPVK_IndirectCallTarget || Kind == InstrProfValueKind::IPVK_MemOPSize)
+ Check(isa<CallBase>(I),
+ "VP !prof indirect call or memop size expected to be applied to "
+ "CallBase instructions only",
+ MD);
} else {
- Check(ProfName == MDProfLabels::ValueProfile,
- "expected either branch_weights or VP profile name", MD);
+ CheckFailed("expected either branch_weights or VP profile name", MD);
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/145584
More information about the llvm-commits
mailing list