forked from OSchip/llvm-project
[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:
parent
81d3144ebf
commit
d556eb7e27
|
@ -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(),
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue