================ @@ -471,6 +471,66 @@ ProfileGenerator::getTopLevelFunctionProfile(FunctionId FuncName) { return ProfileMap.Create(Context); } +// Use a heuristic to determine probe order by checking callsite insertion +// position relative to the BB probes. Sort all the BB probes is in a list, for +// each calliste, compute "ratio = insert position / length of the list". For +// the old order, the probe ids for BB should be all before(smaller than) the +// probe ids for callsite, this ratio should be equal to or close to 1. +bool checkProbeIDIsInMixedOrder(const SampleProfileMap &Profiles) { + // Use flattned profile to maximize the callsites in the profile. + SampleProfileMap flattenProfile; + ProfileConverter::flattenProfile(Profiles, flattenProfile); + + uint32_t PossibleOldOrderNum = 0; + uint32_t PossibleNewOrderNum = 0; + + for (const auto &I : flattenProfile) { + const FunctionSamples &FS = I.second; + // Skip small functions whose profile order are likely random. + if (FS.getBodySamples().size() < 10) + continue; + + std::set<uint32_t> PossibleBBProbeIDs; + std::set<uint32_t> CallsiteIDs; + for (const auto &I : FS.getBodySamples()) { + if (I.second.getCallTargets().empty()) + PossibleBBProbeIDs.insert(I.first.LineOffset); + else + CallsiteIDs.insert(I.first.LineOffset); + } + + if (PossibleBBProbeIDs.empty() || CallsiteIDs.empty()) + continue; + + uint32_t DistanceToBeginSum = 0; + for (const auto &ID : CallsiteIDs) + DistanceToBeginSum += std::distance(PossibleBBProbeIDs.begin(), + PossibleBBProbeIDs.upper_bound(ID)); + uint32_t LengthSum = PossibleBBProbeIDs.size() * CallsiteIDs.size(); + + // Note that PossibleBBProbeIDs could contains some callsite probe id, the ---------------- WenleiHe wrote:
If there is an LBR range (target to source of next LBR) covering a location/probe, and that location has a call, we should be able to see that call in LBR too (because that next LBR will be a call) hence having a call target profiled? I'm curious what lead to empty call targets for a call location covered by LBR.. This heuristic seems more complicated and less reliable than I thought.. https://github.com/llvm/llvm-project/pull/75092 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits