[llvm] [PseudoProbe] Extend to skip instrumenting probe into the dests of invoke (PR #79919)
Lei Wang via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 30 00:09:38 PST 2024
================
@@ -173,20 +173,49 @@ SampleProfileProber::SampleProfileProber(Function &Func,
BlockProbeIds.clear();
CallProbeIds.clear();
LastProbeId = (uint32_t)PseudoProbeReservedId::Last;
- computeProbeIdForBlocks();
+
+ DenseSet<BasicBlock *> InvokeNormalDests;
+ findInvokeNormalDests(InvokeNormalDests);
+ DenseSet<BasicBlock *> KnownColdBlocks;
+ computeEHOnlyBlocks(*F, KnownColdBlocks);
+
+ computeProbeIdForBlocks(InvokeNormalDests, KnownColdBlocks);
computeProbeIdForCallsites();
- computeCFGHash();
+ computeCFGHash(InvokeNormalDests, KnownColdBlocks);
+}
+
+void SampleProfileProber::findInvokeNormalDests(
+ DenseSet<BasicBlock *> &InvokeNormalDests) {
+ for (auto &BB : *F) {
+ auto *TI = BB.getTerminator();
+ if (auto *II = dyn_cast<InvokeInst>(TI))
+ InvokeNormalDests.insert(II->getNormalDest());
+ }
}
// Compute Hash value for the CFG: the lower 32 bits are CRC32 of the index
// value of each BB in the CFG. The higher 32 bits record the number of edges
// preceded by the number of indirect calls.
// This is derived from FuncPGOInstrumentation<Edge, BBInfo>::computeCFGHash().
-void SampleProfileProber::computeCFGHash() {
+void SampleProfileProber::computeCFGHash(
+ const DenseSet<BasicBlock *> &InvokeNormalDests,
+ const DenseSet<BasicBlock *> &KnownColdBlocks) {
std::vector<uint8_t> Indexes;
JamCRC JC;
for (auto &BB : *F) {
- for (BasicBlock *Succ : successors(&BB)) {
+ // Skip the EH flow blocks.
+ if (InvokeNormalDests.contains(&BB) || KnownColdBlocks.contains(&BB))
+ continue;
+
+ // Find the original successors by skipping the EH flow succs.
+ auto *BBPtr = &BB;
+ auto *TI = BBPtr->getTerminator();
+ while (auto *II = dyn_cast<InvokeInst>(TI)) {
+ BBPtr = II->getNormalDest();
+ TI = BBPtr->getTerminator();
+ }
----------------
wlei-llvm wrote:
Correct!
>Should we also exclude zero block Id successors anyways? or assert the successors all have non-zero block Id.
Good point to assert on the non-zero succs, otherwise the checksum is still inconsistent, we still have a small part (<1%) mismatch, maybe this can help find it.
https://github.com/llvm/llvm-project/pull/79919
More information about the llvm-commits
mailing list