diff options
author | Kazu Hirata <kazu@google.com> | 2024-06-22 00:40:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-22 00:40:36 -0700 |
commit | b0ae923ada836fa2c9114ac2c5afb39466f49fe0 (patch) | |
tree | 612042464b9280b9e5004e59732d3ea164d23c7e /llvm/lib/ProfileData/InstrProf.cpp | |
parent | 75006466296ed4b0f845cbbec4bf77c21de43b40 (diff) | |
download | llvm-b0ae923ada836fa2c9114ac2c5afb39466f49fe0.zip llvm-b0ae923ada836fa2c9114ac2c5afb39466f49fe0.tar.gz llvm-b0ae923ada836fa2c9114ac2c5afb39466f49fe0.tar.bz2 |
[ProfileData] Add a variant of getValueProfDataFromInst (#95993)
This patch adds a variant of getValueProfDataFromInst that returns
std::vector<InstrProfValueData> instead of
std::unique<InstrProfValueData[]>. The new return type carries the
length with it, so we can drop out parameter ActualNumValueData.
Also, the caller can directly feed the return value into a range-based
for loop as shown in the patch.
I'm planning to migrate other callers of getValueProfDataFromInst to
the new variant in follow-up patches.
Diffstat (limited to 'llvm/lib/ProfileData/InstrProf.cpp')
-rw-r--r-- | llvm/lib/ProfileData/InstrProf.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 3e0e2b2..c7749f3 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -1382,6 +1382,45 @@ getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, return ValueDataArray; } +SmallVector<InstrProfValueData, 4> +getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, + uint32_t MaxNumValueData, uint64_t &TotalC, + bool GetNoICPValue) { + // Four inline elements seem to work well in practice. With MaxNumValueData, + // this array won't grow very big anyway. + SmallVector<InstrProfValueData, 4> ValueData; + MDNode *MD = mayHaveValueProfileOfKind(Inst, ValueKind); + if (!MD) + return ValueData; + const unsigned NOps = MD->getNumOperands(); + // Get total count + ConstantInt *TotalCInt = mdconst::dyn_extract<ConstantInt>(MD->getOperand(2)); + if (!TotalCInt) + return ValueData; + TotalC = TotalCInt->getZExtValue(); + + ValueData.reserve((NOps - 3) / 2); + for (unsigned I = 3; I < NOps; I += 2) { + if (ValueData.size() >= MaxNumValueData) + break; + ConstantInt *Value = mdconst::dyn_extract<ConstantInt>(MD->getOperand(I)); + ConstantInt *Count = + mdconst::dyn_extract<ConstantInt>(MD->getOperand(I + 1)); + if (!Value || !Count) { + ValueData.clear(); + return ValueData; + } + uint64_t CntValue = Count->getZExtValue(); + if (!GetNoICPValue && (CntValue == NOMORE_ICP_MAGICNUM)) + continue; + InstrProfValueData V; + V.Value = Value->getZExtValue(); + V.Count = CntValue; + ValueData.push_back(V); + } + return ValueData; +} + MDNode *getPGOFuncNameMetadata(const Function &F) { return F.getMetadata(getPGOFuncNameMetadataName()); } |