forked from OSchip/llvm-project
[DwarfDebug] Improve validThroughout performance (4/4)
Almost NFC (see end). The backwards scan in validThroughout significantly contributed to compile time for a pathological case, causing the 'X86 Assembly Printer' pass to account for roughly 70% of the run time. This patch guards the loop against running unnecessarily, bringing the pass contribution down to 4%. Almost NFC: There is a hack in validThroughout which promotes single constant value DBG_VALUEs in the prologue to be live throughout the function. We're more likely to hit this code path with this patch applied. Similarly to the parent patches there is a small coverage change reported in the order of 10s of bytes. Reviewed By: aprantl Differential Revision: https://reviews.llvm.org/D86153
This commit is contained in:
parent
3c491881d2
commit
57d8acac64
|
@ -1531,27 +1531,30 @@ static bool validThroughout(LexicalScopes &LScopes,
|
|||
if (LSRange.size() == 0)
|
||||
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 the scope starts before the DBG_VALUE then we may have a negative
|
||||
// result. Otherwise the location is live coming into the scope and we
|
||||
// can skip the following checks.
|
||||
if (!Ordering.isBefore(DbgValue, LScopeBegin)) {
|
||||
// Exit if the lexical scope begins outside of the current block.
|
||||
if (LScopeBegin->getParent() != MBB)
|
||||
return false;
|
||||
|
||||
MachineBasicBlock::const_reverse_iterator Pred(DbgValue);
|
||||
for (++Pred; Pred != MBB->rend(); ++Pred) {
|
||||
if (Pred->getFlag(MachineInstr::FrameSetup))
|
||||
break;
|
||||
auto PredDL = Pred->getDebugLoc();
|
||||
if (!PredDL || Pred->isMetaInstruction())
|
||||
continue;
|
||||
// Check whether the instruction preceding the DBG_VALUE is in the same
|
||||
// (sub)scope as the DBG_VALUE.
|
||||
if (DL->getScope() == PredDL->getScope())
|
||||
return false;
|
||||
auto *PredScope = LScopes.findLexicalScope(PredDL);
|
||||
if (!PredScope || LScope->dominates(PredScope))
|
||||
return false;
|
||||
MachineBasicBlock::const_reverse_iterator Pred(DbgValue);
|
||||
for (++Pred; Pred != MBB->rend(); ++Pred) {
|
||||
if (Pred->getFlag(MachineInstr::FrameSetup))
|
||||
break;
|
||||
auto PredDL = Pred->getDebugLoc();
|
||||
if (!PredDL || Pred->isMetaInstruction())
|
||||
continue;
|
||||
// Check whether the instruction preceding the DBG_VALUE is in the same
|
||||
// (sub)scope as the DBG_VALUE.
|
||||
if (DL->getScope() == PredDL->getScope())
|
||||
return false;
|
||||
auto *PredScope = LScopes.findLexicalScope(PredDL);
|
||||
if (!PredScope || LScope->dominates(PredScope))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If the range of the DBG_VALUE is open-ended, report success.
|
||||
|
|
|
@ -19,8 +19,7 @@
|
|||
; CHECK: DW_TAG_inlined_subroutine
|
||||
; CHECK-NEXT: DW_AT_abstract_origin {{.*}} "bar"
|
||||
; CHECK: DW_TAG_formal_parameter
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_data4] (
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_consts +0)
|
||||
; CHECK-NEXT: DW_AT_const_value [DW_FORM_sdata] (0)
|
||||
; CHECK-NEXT: DW_AT_abstract_origin {{.*}} "a"
|
||||
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
|
Loading…
Reference in New Issue