[llvm] r251353 - Move imported entities into DwarfCompilationUnit to speed up LTO linking.
Ivan Krasin via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 26 14:54:35 PDT 2015
On Mon, Oct 26, 2015 at 2:48 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Mon, Oct 26, 2015 at 2:36 PM, Ivan Krasin via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: krasin
>> Date: Mon Oct 26 16:36:35 2015
>> New Revision: 251353
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=251353&view=rev
>> Log:
>> Move imported entities into DwarfCompilationUnit to speed up LTO linking.
>>
>> Summary:
>> In particular, this CL speeds up the official Chrome linking with LTO by
>> 1.8x.
>>
>> See more details in https://crbug.com/542426
>>
>> Reviewers: dblaikie
>>
>> Subscribers: jevinskie
>>
>> Differential Revision: http://reviews.llvm.org/D13918
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=251353&r1=251352&r2=251353&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Oct 26
>> 16:36:35 2015
>> @@ -342,9 +342,9 @@ void DwarfCompileUnit::constructScopeDIE
>> // Skip imported directives in gmlt-like data.
>> if (!includeMinimalInlineScopes()) {
>> // There is no need to emit empty lexical block DIE.
>> - for (const auto &E : DD->findImportedEntitiesForScope(DS))
>> - Children.push_back(
>> -
>> constructImportedEntityDIE(cast<DIImportedEntity>(E.second)));
>> + for (const auto *IE : ImportedEntities[DS])
>> + Children.push_back(
>>
>
> Looks like an extra indent happened on the line above (seems like the body
> of the for loop is indented 4 spaces instead of 2)
>
Looking...
>
>
>> + constructImportedEntityDIE(cast<DIImportedEntity>(IE)));
>> }
>>
>> // If there are only other scopes as children, put them directly in
>> the
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=251353&r1=251352&r2=251353&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Mon Oct 26
>> 16:36:35 2015
>> @@ -39,6 +39,12 @@ class DwarfCompileUnit : public DwarfUni
>> /// The start of the unit within its section.
>> MCSymbol *LabelBegin;
>>
>> + typedef llvm::SmallVector<const MDNode *, 8> ImportedEntityList;
>> + typedef llvm::DenseMap<const MDNode *, ImportedEntityList>
>> + ImportedEntityMap;
>> +
>> + ImportedEntityMap ImportedEntities;
>>
>
> Are you going to experiment with switching this back to a sorted sequence?
> Might be a nice memory savings over the overhead of densemap+vectors?
> Possibly a runtime savings too in terms of building the structures
> (building, sorting, then searching can be cheaper than incremental building
> maintaining the sorted invariant) Or was this actually better performing
> than the original data structure choice? (even once moved to a per-CU level)
>
I tried the sorted sequence. It was either slower, or ugly. Depends on the
variant I tried. As for memory consumption, we'll see if this change make
the situation much worse.
For the reference, linking Chrome with LTO (this patch included) requires
~32 GB of RAM.
>
>
>> +
>> /// GlobalNames - A map of globally visible named entities for this
>> unit.
>> StringMap<const DIE *> GlobalNames;
>>
>> @@ -98,6 +104,10 @@ public:
>>
>> unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName)
>> override;
>>
>> + void addImportedEntity(const DIImportedEntity* IE) {
>> + ImportedEntities[IE->getScope()].push_back(IE);
>> + }
>> +
>> /// addRange - Add an address range to the list of ranges for this
>> unit.
>> void addRange(RangeSpan Range);
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=251353&r1=251352&r2=251353&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Oct 26 16:36:35
>> 2015
>> @@ -489,12 +489,7 @@ void DwarfDebug::beginModule() {
>> auto *CUNode = cast<DICompileUnit>(N);
>> DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
>> for (auto *IE : CUNode->getImportedEntities())
>> -
>> ScopesWithImportedEntities.push_back(std::make_pair(IE->getScope(), IE));
>> - // Stable sort to preserve the order of appearance of imported
>> entities.
>> - // This is to avoid out-of-order processing of interdependent
>> declarations
>> - // within the same scope, e.g. { namespace A = base; namespace B =
>> A; }
>> - std::stable_sort(ScopesWithImportedEntities.begin(),
>> - ScopesWithImportedEntities.end(), less_first());
>> + CU.addImportedEntity(IE);
>> for (auto *GV : CUNode->getGlobalVariables())
>> CU.getOrCreateGlobalVariableDIE(GV);
>> for (auto *SP : CUNode->getSubprograms())
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=251353&r1=251352&r2=251353&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Mon Oct 26 16:36:35
>> 2015
>> @@ -289,11 +289,6 @@ class DwarfDebug : public AsmPrinterHand
>> /// Holders for the various debug information flags that we might need
>> to
>> /// have exposed. See accessor functions below for description.
>>
>> - /// Holder for imported entities.
>> - typedef SmallVector<std::pair<const MDNode *, const MDNode *>, 32>
>> - ImportedEntityMap;
>> - ImportedEntityMap ScopesWithImportedEntities;
>> -
>> /// Map from MDNodes for user-defined types to the type units that
>> /// describe them.
>> DenseMap<const MDNode *, const DwarfTypeUnit *> DwarfTypeUnits;
>> @@ -626,14 +621,6 @@ public:
>>
>> const MachineFunction *getCurrentFunction() const { return CurFn; }
>>
>> - iterator_range<ImportedEntityMap::const_iterator>
>> - findImportedEntitiesForScope(const MDNode *Scope) const {
>> - return make_range(std::equal_range(
>> - ScopesWithImportedEntities.begin(),
>> ScopesWithImportedEntities.end(),
>> - std::pair<const MDNode *, const MDNode *>(Scope, nullptr),
>> - less_first()));
>> - }
>> -
>> /// A helper function to check whether the DIE for a given Scope is
>> /// going to be null.
>> bool isLexicalScopeDIENull(LexicalScope *Scope);
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151026/fe029597/attachment.html>
More information about the llvm-commits
mailing list