Revert "[BOLT][NFC] Register profiled functions once (#150622)" (#152597)

In perf2bolt, we are observing sporadic crashes in the recently added
registerProfiledFunctions from #150622. Addresses provided by the
hardware (from LBR) might be -1, which clashes with what LLVM uses in
DenseSet as empty tombstones records. This causes DenseSet to assert
with "can't insert empty tombstone into map" when ingesting this
data. Revert this change for now to unbreak perf2bolt.
This commit is contained in:
Rafael Auler
2025-08-07 15:28:22 -07:00
committed by GitHub
parent 82046c7f33
commit 47f54e4992
2 changed files with 18 additions and 24 deletions

View File

@@ -502,9 +502,6 @@ private:
/// entries).
void imputeFallThroughs();
/// Register profiled functions for lite mode.
void registerProfiledFunctions();
/// Debugging dump methods
void dump() const;
void dump(const PerfBranchSample &Sample) const;

View File

@@ -581,26 +581,6 @@ void DataAggregator::imputeFallThroughs() {
outs() << "BOLT-INFO: imputed " << InferredTraces << " traces\n";
}
void DataAggregator::registerProfiledFunctions() {
DenseSet<uint64_t> Addrs;
for (const auto &Trace : llvm::make_first_range(Traces)) {
if (Trace.Branch != Trace::FT_ONLY &&
Trace.Branch != Trace::FT_EXTERNAL_ORIGIN)
Addrs.insert(Trace.Branch);
Addrs.insert(Trace.From);
}
for (const auto [PC, _] : BasicSamples)
Addrs.insert(PC);
for (const PerfMemSample &MemSample : MemSamples)
Addrs.insert(MemSample.PC);
for (const uint64_t Addr : Addrs)
if (BinaryFunction *Func = getBinaryFunctionContainingAddress(Addr))
Func->setHasProfileAvailable();
}
Error DataAggregator::preprocessProfile(BinaryContext &BC) {
this->BC = &BC;
@@ -623,7 +603,6 @@ Error DataAggregator::preprocessProfile(BinaryContext &BC) {
exit(0);
}
registerProfiledFunctions();
return Error::success();
}
@@ -1368,6 +1347,10 @@ std::error_code DataAggregator::parseAggregatedLBREntry() {
}
const uint64_t FromOffset = Addr[0]->Offset;
BinaryFunction *FromFunc = getBinaryFunctionContainingAddress(FromOffset);
if (FromFunc)
FromFunc->setHasProfileAvailable();
int64_t Count = Counters[0];
int64_t Mispreds = Counters[1];
@@ -1378,6 +1361,11 @@ std::error_code DataAggregator::parseAggregatedLBREntry() {
return std::error_code();
}
const uint64_t ToOffset = Addr[1]->Offset;
BinaryFunction *ToFunc = getBinaryFunctionContainingAddress(ToOffset);
if (ToFunc)
ToFunc->setHasProfileAvailable();
/// For fall-through types, adjust locations to match Trace container.
if (Type == FT || Type == FT_EXTERNAL_ORIGIN || Type == FT_EXTERNAL_RETURN) {
Addr[2] = Location(Addr[1]->Offset); // Trace To
@@ -1625,6 +1613,9 @@ std::error_code DataAggregator::parseBranchEvents() {
Traces.reserve(TraceMap.size());
for (const auto &[Trace, Info] : TraceMap) {
Traces.emplace_back(Trace, Info);
for (const uint64_t Addr : {Trace.Branch, Trace.From})
if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Addr))
BF->setHasProfileAvailable();
}
clear(TraceMap);
@@ -1685,6 +1676,9 @@ std::error_code DataAggregator::parseBasicEvents() {
continue;
++NumTotalSamples;
if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Sample->PC))
BF->setHasProfileAvailable();
++BasicSamples[Sample->PC];
EventNames.insert(Sample->EventName);
}
@@ -1722,6 +1716,9 @@ std::error_code DataAggregator::parseMemEvents() {
if (std::error_code EC = Sample.getError())
return EC;
if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Sample->PC))
BF->setHasProfileAvailable();
MemSamples.emplace_back(std::move(Sample.get()));
}