[PATCH] D16571: Compute the DISubprogram hash key partially (NFC)
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 7 12:35:18 PST 2016
On Mon, Mar 7, 2016 at 12:34 PM, Duncan P. N. Exon Smith <
dexonsmith at apple.com> wrote:
>
> > On 2016-Mar-07, at 11:49, David Blaikie <dblaikie at gmail.com> wrote:
> >
> >
> >
> > On Mon, Mar 7, 2016 at 9:00 AM, Mehdi Amini <mehdi.amini at apple.com>
> wrote:
> >
> >> On Mar 7, 2016, at 6:30 AM, David Blaikie <dblaikie at gmail.com> wrote:
> >>
> >>
> >>
> >> On Mon, Mar 7, 2016 at 1:45 AM, Mehdi Amini via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
> >>
> >> > On Mar 6, 2016, at 5:31 PM, Duncan P. N. Exon Smith <
> dexonsmith at apple.com> wrote:
> >> >
> >> > Sorry, I thought I'd responded back in January. This approach SGTM.
> >> >
> >> > I have some ideas about field choice below. If you've profiled -flto
> -g
> >> > with something non-trivial, then I'm happy for you to commit (LGTM!),
> but
> >> > you might be able to extract even better performance.
> >> >
> >> >> On 2016-Mar-05, at 23:13, Mehdi AMINI <mehdi.amini at apple.com> wrote:
> >> >>
> >> >> joker.eph updated this revision to Diff 49892.
> >> >> joker.eph updated the summary for this revision.
> >> >> joker.eph added a comment.
> >> >>
> >> >> Change the order of arguments as suggested by Eric.
> >> >>
> >> >> Duncan?
> >> >>
> >> >>
> >> >> http://reviews.llvm.org/D16571
> >> >>
> >> >> Files:
> >> >> lib/IR/LLVMContextImpl.h
> >> >>
> >> >> Index: lib/IR/LLVMContextImpl.h
> >> >> ===================================================================
> >> >> --- lib/IR/LLVMContextImpl.h
> >> >> +++ lib/IR/LLVMContextImpl.h
> >> >> @@ -365,8 +365,7 @@
> >> >> ExtraData == RHS->getRawExtraData();
> >> >> }
> >> >> unsigned getHashValue() const {
> >> >> - return hash_combine(Tag, Name, File, Line, Scope, BaseType,
> SizeInBits,
> >> >> - AlignInBits, OffsetInBits, Flags,
> ExtraData);
> >> >> + return hash_combine(Name, File, Line, Scope, BaseType);
> >> >
> >> > I suspect the most important distinguishers are:
> >> > - Tag
> >> > - Name
> >> > - BaseType
> >> > - Scope
> >> >
> >> > This tells you the kind of the derived type (pointer, typedef, etc.),
> >> > its name (if any), what it's derived from, and where it's defined. In
> >> > other words, I suggest dropping File/Line (which is often left blank)
> >> > and adding back Tag.
> >> >
> >> > However, you should confirm that dropping File/Line doesn't hurt
> >> > performance of -flto=full.
> >>
> >> Unfortunately it does:
> >>
> >> !317 = !DIDerivedType(tag: DW_TAG_typedef, name: "size_type", file:
> !234, line: 97, baseType: !268)
> >> !578 = !DIDerivedType(tag: DW_TAG_typedef, name: "size_type", file:
> !544, line: 1709, baseType: !268)
> >> !15757 = !DIDerivedType(tag: DW_TAG_typedef, name: "size_type", file:
> !15753, line: 36, baseType: !268)
> >> ....
> >>
> >>
> >> These are corresponding to declaration like:
> >>
> >> typedef typename __alloc_traits::size_type size_type;
> >>
> >> in classes like std::vector_base.
> >>
> >> There are similar corner cases with the other types.
> >>
> >> What's the behavior when you drop file/line from these?
> >>
> >> We could probably manufacture correct C++ code that still tickles those
> problems:
> >>
> >> foo.def
> >> typedef int x;
> >>
> >> a.h:
> >> struct a {
> >> #include "foo.def"
> >> };
> >>
> >> b.h:
> >> struct b {
> >> #include "bar.def"
> >> };
> >>
> >> So maybe this is a bug we should fix regardless? But maybe that's
> difficult...
> >
> > There's no correctness issue involved. The worst would be that more
> hashes would collide in the map and you need to probe longer.
> > (If this does not answer, I'm not sure I understood what you meant)
> >
> > If we removed the file/line from those typedefs, wouldn't they collapse
> to a single DI node during LTO linking? If that happened, I imagine we
> might have trouble tracking them separately (eg: correctly describing
> variables as being on one type but not the other, etc)?
>
> This removes the file/line from DenseMapInfo::getHashValue, but leaves
> DenseMapInfo::getEqualTo unchanged. This should only impact compile
> time; in other words, there should be no semantic change.
>
> The tradeoff here is:
> - Fewer fields => the hash cheaper to calculate.
> - Fewer fields => more hash collisions => more probing.
>
Ah, thanks for the context. Sorry for the confusion.
>
> >
> >
> >
> > --
> > Mehdi
> >
> >
> >
> >>
> >>
> >> --
> >> Mehdi
> >>
> >>
> >>
> >>
> >> >
> >> >> }
> >> >> };
> >> >>
> >> >> @@ -422,9 +421,7 @@
> >> >> Identifier == RHS->getIdentifier();
> >> >> }
> >> >> unsigned getHashValue() const {
> >> >> - return hash_combine(Tag, Name, File, Line, Scope, BaseType,
> SizeInBits,
> >> >> - AlignInBits, OffsetInBits, Flags, Elements,
> RuntimeLang,
> >> >> - VTableHolder, TemplateParams, Identifier);
> >> >> + return hash_combine(Name, File, Line, Scope, SizeInBits,
> Elements);
> >> >
> >> > I feel like you can safely drop SizeInBits and Elements. I think it's
> >> > unlikely the other four fields will collide.
> >> >
> >> > Again, you should profile -flto=full with -g before dropping this.
> >> >
> >> >> }
> >> >> };
> >> >>
> >> >> @@ -518,10 +515,7 @@
> >> >> Variables == RHS->getRawVariables();
> >> >> }
> >> >> unsigned getHashValue() const {
> >> >> - return hash_combine(Scope, Name, LinkageName, File, Line, Type,
> >> >> - IsLocalToUnit, IsDefinition, ScopeLine,
> ContainingType,
> >> >> - Virtuality, VirtualIndex, Flags,
> IsOptimized,
> >> >> - TemplateParams, Declaration, Variables);
> >> >> + return hash_combine(File, Line, Type, Scope);
> >> >> }
> >> >> };
> >> >
> >> > It feels strange to leave both Name and LinkageName out here. I'm not
> >> > sure it's wrong though. As long as you've profiled this.
> >> >
> >> >>
> >> >>
> >> >>
> >> >> <D16571.49892.patch>
> >>
> >> _______________________________________________
> >> 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/20160307/a06b7b6a/attachment.html>
More information about the llvm-commits
mailing list