[DebugInfo][InstrRef][NFC] Cache some PHI resolutions

Install a cache of DBG_INSTR_REF -> ValueIDNum resolutions, for scenarios
where the value has to be reconstructed from several DBG_PHIs. Whenever
this happens, it's because branch folding + tail duplication has messed
with the SSA form of the program, and we have to solve a mini SSA problem
to find the variable value. This is always called twice, so it makes sense
to cache the value.

This gives a ~0.5% geomean compile-time-performance improvement on CTMark.

Differential Revision: https://reviews.llvm.org/D118455
This commit is contained in:
Jeremy Morse 2022-02-02 12:12:32 +00:00
parent 81d3144ebf
commit d556eb7e27
2 changed files with 28 additions and 0 deletions

View File

@ -3122,6 +3122,7 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
DebugPHINumToValue.clear(); DebugPHINumToValue.clear();
OverlapFragments.clear(); OverlapFragments.clear();
SeenFragments.clear(); SeenFragments.clear();
SeenDbgPHIs.clear();
return Changed; return Changed;
} }
@ -3387,6 +3388,21 @@ Optional<ValueIDNum> InstrRefBasedLDV::resolveDbgPHIs(MachineFunction &MF,
ValueIDNum **MLiveIns, ValueIDNum **MLiveIns,
MachineInstr &Here, MachineInstr &Here,
uint64_t InstrNum) { uint64_t InstrNum) {
// This function will be called twice per DBG_INSTR_REF, and might end up
// computing lots of SSA information: memoize it.
auto SeenDbgPHIIt = SeenDbgPHIs.find(&Here);
if (SeenDbgPHIIt != SeenDbgPHIs.end())
return SeenDbgPHIIt->second;
Optional<ValueIDNum> Result =
resolveDbgPHIsImpl(MF, MLiveOuts, MLiveIns, Here, InstrNum);
SeenDbgPHIs.insert({&Here, Result});
return Result;
}
Optional<ValueIDNum> InstrRefBasedLDV::resolveDbgPHIsImpl(
MachineFunction &MF, ValueIDNum **MLiveOuts, ValueIDNum **MLiveIns,
MachineInstr &Here, uint64_t InstrNum) {
// Pick out records of DBG_PHI instructions that have been observed. If there // Pick out records of DBG_PHI instructions that have been observed. If there
// are none, then we cannot compute a value number. // are none, then we cannot compute a value number.
auto RangePair = std::equal_range(DebugPHINumToValue.begin(), auto RangePair = std::equal_range(DebugPHINumToValue.begin(),

View File

@ -864,6 +864,12 @@ private:
OverlapMap OverlapFragments; OverlapMap OverlapFragments;
VarToFragments SeenFragments; VarToFragments SeenFragments;
/// Mapping of DBG_INSTR_REF instructions to their values, for those
/// DBG_INSTR_REFs that call resolveDbgPHIs. These variable references solve
/// a mini SSA problem caused by DBG_PHIs being cloned, this collection caches
/// the result.
DenseMap<MachineInstr *, Optional<ValueIDNum>> SeenDbgPHIs;
/// True if we need to examine call instructions for stack clobbers. We /// True if we need to examine call instructions for stack clobbers. We
/// normally assume that they don't clobber SP, but stack probes on Windows /// normally assume that they don't clobber SP, but stack probes on Windows
/// do. /// do.
@ -944,6 +950,12 @@ private:
ValueIDNum **MLiveIns, MachineInstr &Here, ValueIDNum **MLiveIns, MachineInstr &Here,
uint64_t InstrNum); uint64_t InstrNum);
Optional<ValueIDNum> resolveDbgPHIsImpl(MachineFunction &MF,
ValueIDNum **MLiveOuts,
ValueIDNum **MLiveIns,
MachineInstr &Here,
uint64_t InstrNum);
/// Step through the function, recording register definitions and movements /// Step through the function, recording register definitions and movements
/// in an MLocTracker. Convert the observations into a per-block transfer /// in an MLocTracker. Convert the observations into a per-block transfer
/// function in \p MLocTransfer, suitable for using with the machine value /// function in \p MLocTransfer, suitable for using with the machine value