[llvm] [TRE] Adjust function entry count when using instrumented profiles (PR #143987)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 19 08:06:09 PDT 2025
================
@@ -735,6 +757,28 @@ bool TailRecursionEliminator::eliminateCall(CallInst *CI) {
CI->eraseFromParent(); // Remove call.
DTU.applyUpdates({{DominatorTree::Insert, BB, HeaderBB}});
++NumEliminated;
+ if (OrigEntryBBFreq) {
+ assert(F.getEntryCount().has_value());
+ // This pass is not expected to remove BBs, only add an entry BB. For that
+ // reason, and because the BB here isn't the new entry BB, the BFI lookup is
+ // expected to succeed.
+ assert(&F.getEntryBlock() != BB);
+ auto RelativeBBFreq =
+ static_cast<double>(BFI->getBlockFreq(BB).getFrequency()) /
+ static_cast<double>(OrigEntryBBFreq);
+ auto OldEntryCount = F.getEntryCount()->getCount();
+ auto ToSubtract =
+ static_cast<uint64_t>(std::round(RelativeBBFreq * OldEntryCount));
+ if (OldEntryCount <= ToSubtract) {
+ LLVM_DEBUG(
+ errs() << "[TRE] The entrycount attributable to the recursive call, "
+ << ToSubtract
+ << ", should be strictly lower than the original function "
+ "entry count, "
+ << OldEntryCount << "\n");
+ }
+ F.setEntryCount(OldEntryCount - ToSubtract, F.getEntryCount()->getType());
----------------
teresajohnson wrote:
I still think it would make sense to put this under the else though. Garbage-in-garbage-out in either case but seems like it could become a lot worse (e.g. look incredibly hot with an unsigned wrap around underflow).
https://github.com/llvm/llvm-project/pull/143987
More information about the llvm-commits
mailing list