Skip to content

Commit

Permalink
[DwarfDebug] Improve validThroughout performance (4/4)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
OCHyams committed Aug 27, 2020
1 parent 3c49188 commit 57d8aca
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 21 deletions.
41 changes: 22 additions & 19 deletions llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

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))
// 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;
}
}

// If the range of the DBG_VALUE is open-ended, report success.
Expand Down
3 changes: 1 addition & 2 deletions llvm/test/DebugInfo/X86/inlined-formal-parameter.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 57d8aca

Please sign in to comment.