mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
[DebugInfo][NFC] Early-exit when analyzing for single-location variables
This is a performance patch that hoists two conditions in DwarfDebug's validThroughout to avoid a linear-scan of all instructions in a block. We now exit early if validThrougout will never return true for the variable location. The first added clause filters for the two circumstances where validThroughout will return true. The second added clause should be identical to the one that's deleted from after the linear-scan. Differential Revision: https://reviews.llvm.org/D77639
This commit is contained in:
parent
9411f6a4ad
commit
c4f32ed24d
@ -1480,11 +1480,24 @@ static bool validThroughout(LexicalScopes &LScopes,
|
||||
if (LSRange.size() == 0)
|
||||
return false;
|
||||
|
||||
// If this range is neither open ended nor a constant, then it is not a
|
||||
// candidate for being validThroughout.
|
||||
if (RangeEnd && !DbgValue->getOperand(0).isImm())
|
||||
return false;
|
||||
|
||||
// Determine if the DBG_VALUE is valid at the beginning of its lexical block.
|
||||
const MachineInstr *LScopeBegin = LSRange.front().first;
|
||||
// Early exit if the lexical scope begins outside of the current block.
|
||||
if (LScopeBegin->getParent() != MBB)
|
||||
return false;
|
||||
|
||||
// If there are instructions belonging to our scope in another block, and
|
||||
// we're not a constant (see DWARF2 comment below), then we can't be
|
||||
// validThroughout.
|
||||
const MachineInstr *LScopeEnd = LSRange.back().second;
|
||||
if (RangeEnd && LScopeEnd->getParent() != MBB)
|
||||
return false;
|
||||
|
||||
MachineBasicBlock::const_reverse_iterator Pred(DbgValue);
|
||||
for (++Pred; Pred != MBB->rend(); ++Pred) {
|
||||
if (Pred->getFlag(MachineInstr::FrameSetup))
|
||||
@ -1505,11 +1518,6 @@ static bool validThroughout(LexicalScopes &LScopes,
|
||||
if (!RangeEnd)
|
||||
return true;
|
||||
|
||||
// Fail if there are instructions belonging to our scope in another block.
|
||||
const MachineInstr *LScopeEnd = LSRange.back().second;
|
||||
if (LScopeEnd->getParent() != MBB)
|
||||
return false;
|
||||
|
||||
// Single, constant DBG_VALUEs in the prologue are promoted to be live
|
||||
// throughout the function. This is a hack, presumably for DWARF v2 and not
|
||||
// necessarily correct. It would be much better to use a dbg.declare instead
|
||||
|
Loading…
Reference in New Issue
Block a user