[llvm] r246098 - DI: Make Subprogram definitions 'distinct'
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 26 17:01:46 PDT 2015
On Wed, Aug 26, 2015 at 3:50 PM, Duncan P. N. Exon Smith via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: dexonsmith
> Date: Wed Aug 26 17:50:16 2015
> New Revision: 246098
>
> URL: http://llvm.org/viewvc/llvm-project?rev=246098&view=rev
> Log:
> DI: Make Subprogram definitions 'distinct'
>
> Change `DIBuilder` always to produce 'distinct' nodes when creating
> `DISubprogram` definitions. I measured a ~5% memory improvement in the
> link step (of ld64) when using `-flto -g`.
>
> `DISubprogram`s are used in two ways in the debug info graph.
>
> Some are definitions, point at actual functions, and can't really be
> shared between compile units. With full debug info, these point down at
> their variables, forming uniquing cycles. These uniquing cycles are
> expensive to link between modules, since all unique nodes that reference
> them transitively need to be duplicated (see commit message for r244181
> for more details).
>
*reads r244181*
This does seem a bit awkward that we'll need to mark any
regularly-cycle-creating nodes as distinct for performance reasons... :/
(but I imagine there's not much else to be done about it - ceratinly it's
easy for the nodes that obviously wanted distinct-ness to begin with, but
those that just happened across it due to a relationship like the
subprogram->variable one (we only emit the variable list in optimized mode
though, don't we?) seem quirk-ily unfortunate)
Speaking of the unoptimized case (that doesn't have a variable list, if I
recall correctly - but maybe we changed that) - is this worse in any way to
mark these nodes as distinct? Did they get naturally deduplicated
previously & now have to be explicitly de duplicated? Not sure.
I guess at some point these will be attached to llvm::Functions directly, I
think was the idea? (though not sure how we'll make a CU list of
subprograms/functions to generate) Not sure if that'll change/simplify/make
this less odd...
>
> Others are declarations, primarily used for member functions in the type
> hierarchy. Definitions never show up there; instead, a definition
> points at its corresponding declaration node.
>
> I started by making all subprograms 'distinct'. However, that was too
> big a hammer: memory usage *increased* ~5% (net increase vs. this patch
> of ~10%) because the 'distinct' declarations undermine LTO type
> uniquing. This is a targeted fix for the definitions (where uniquing is
> an observable problem).
>
> A couple of notes:
>
> - There's an accompanying commit to update IRGen testcases in clang.
> - ^ That's what I'm using to test this commit.
> - In a follow-up, I'll change the verifier to require 'distinct' on
> definitions and add an upgrade to `BitcodeReader`.
>
> Modified:
> llvm/trunk/lib/IR/DIBuilder.cpp
>
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=246098&r1=246097&r2=246098&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Wed Aug 26 17:50:16 2015
> @@ -675,6 +675,13 @@ DISubprogram *DIBuilder::createFunction(
> Flags, isOptimized, Fn, TParams, Decl);
> }
>
> +template <class... Ts>
> +static DISubprogram *getSubprogram(bool IsDistinct, Ts &&... Args) {
> + if (IsDistinct)
> + return DISubprogram::getDistinct(std::forward<Ts>(Args)...);
> + return DISubprogram::get(std::forward<Ts>(Args)...);
> +}
> +
> DISubprogram *DIBuilder::createFunction(DIScope *Context, StringRef Name,
> StringRef LinkageName, DIFile
> *File,
> unsigned LineNo, DISubroutineType
> *Ty,
> @@ -684,12 +691,13 @@ DISubprogram *DIBuilder::createFunction(
> MDNode *TParams, MDNode *Decl) {
> assert(Ty->getTag() == dwarf::DW_TAG_subroutine_type &&
> "function types should be subroutines");
> - auto *Node = DISubprogram::get(
> - VMContext, DIScopeRef::get(getNonCompileUnitScope(Context)), Name,
> - LinkageName, File, LineNo, Ty, isLocalToUnit, isDefinition,
> ScopeLine,
> - nullptr, 0, 0, Flags, isOptimized, Fn,
> cast_or_null<MDTuple>(TParams),
> - cast_or_null<DISubprogram>(Decl),
> - MDTuple::getTemporary(VMContext, None).release());
> + auto *Node = getSubprogram(/* IsDistinct = */ isDefinition, VMContext,
> +
> DIScopeRef::get(getNonCompileUnitScope(Context)),
> + Name, LinkageName, File, LineNo, Ty,
> isLocalToUnit,
> + isDefinition, ScopeLine, nullptr, 0, 0,
> Flags,
> + isOptimized, Fn,
> cast_or_null<MDTuple>(TParams),
> + cast_or_null<DISubprogram>(Decl),
> + MDTuple::getTemporary(VMContext,
> None).release());
>
> if (isDefinition)
> AllSubprograms.push_back(Node);
> @@ -723,11 +731,12 @@ DIBuilder::createMethod(DIScope *Context
> "Methods should have both a Context and a context that isn't "
> "the compile unit.");
> // FIXME: Do we want to use different scope/lines?
> - auto *SP = DISubprogram::get(
> - VMContext, DIScopeRef::get(cast<DIScope>(Context)), Name,
> LinkageName, F,
> - LineNo, Ty, isLocalToUnit, isDefinition, LineNo,
> - DITypeRef::get(VTableHolder), VK, VIndex, Flags, isOptimized, Fn,
> - cast_or_null<MDTuple>(TParam), nullptr, nullptr);
> + auto *SP = getSubprogram(/* IsDistinct = */ isDefinition, VMContext,
> + DIScopeRef::get(cast<DIScope>(Context)), Name,
> + LinkageName, F, LineNo, Ty, isLocalToUnit,
> + isDefinition, LineNo,
> DITypeRef::get(VTableHolder),
> + VK, VIndex, Flags, isOptimized, Fn,
> + cast_or_null<MDTuple>(TParam), nullptr,
> nullptr);
>
> if (isDefinition)
> AllSubprograms.push_back(SP);
>
>
> _______________________________________________
> 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/20150826/ae46272c/attachment.html>
More information about the llvm-commits
mailing list