[LLVMdev] [RFC] Separating Metadata from the Value hierarchy
Hal Finkel
hfinkel at anl.gov
Mon Nov 10 10:24:25 PST 2014
----- Original Message -----
> From: "Duncan P. N. Exon Smith" <dexonsmith at apple.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Sent: Monday, November 10, 2014 11:08:24 AM
> Subject: Re: [LLVMdev] [RFC] Separating Metadata from the Value hierarchy
>
>
> > On 2014-Nov-09, at 22:24, Hal Finkel <hfinkel at anl.gov> wrote:
> >
> > ----- Original Message -----
> >> From: "Duncan P. N. Exon Smith" <dexonsmith at apple.com>
> >> To: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> >> Sent: Sunday, November 9, 2014 7:02:43 PM
> >> Subject: [LLVMdev] [RFC] Separating Metadata from the Value
> >> hierarchy
> >>
> >>
> >>
> >> TL;DR: If you use metadata (especially if it's out-of-tree), check
> >> the
> >> numbered list of lost functionality below to see whether I'm
> >> trying
> >> to
> >> break your compiler permanently.
> >>
> >> In response to my recent commits (e.g., [1]) that changed API from
> >> `MDNode` to `Value`, Eric had a really interesting idea [2] --
> >> split
> >> metadata entirely from the `Value` hierarchy, and drop general
> >> support
> >> for metadata RAUW.
> >>
> >> After hacking together some example code, this seems
> >> overwhelmingly
> >> to
> >> me like the right direction. See the attached metadata-v2.patch
> >> for
> >> my
> >> sketch of what the current metadata primitives might look like in
> >> the
> >> new hierarchy (includes LLVMContextImpl uniquing support).
> >>
> >> The initial motivation was to avoid the API weaknesses caused by
> >> having
> >> non-`MDNode` metadata that inherits from `Value`. In particular,
> >> instead of changing API from `MDNode` to `Value`, change it to a
> >> base
> >> class called `Metadata`, which sheds the underused and expensive
> >> `Value`
> >> base class entirely.
> >>
> >> The implications are broader: an enormous reduction in complexity
> >> (and
> >> overhead) for metadata.
> >>
> >> This change implies minor (major?) loss of functionality for
> >> metadata,
> >> but Eric and I suspect that the only hard-to-fix user is debug
> >> info
> >> itself, whose IR infrastructure I'm rewriting anyway.
> >>
> >> Here is what we'd lose:
> >>
> >> 1. No more arbitrary RAUW of metadata.
> >>
> >> While we'd keep support for RAUW of temporary MDNodes for use as
> >> forward declarations (when parsing assembly or constructing cyclic
> >> graphs), drop RAUW support for all other metadata.
> >
> > So temporary MDNodes would be Values, but regular metadata would
> > not be? Will regular metadata nodes no longer have lists of users?
> > If I have a TrackingVH<MDNode> with temporary MDNodes, after I
> > call replaceAllUsesWith, what happens?
> >
> > I'm specifically wondering how we'll need to update
> > CloneAliasScopeMetadata in
> > lib/Transforms/Utils/InlineFunction.cpp, and I don't see any
> > fundamental problem with what you've proposed, but these seem like
> > generic upgrade questions.
> >
> > Thanks again,
> > Hal
>
> So, none of them would be `Value`s.
>
> `TempMDNode` supports its own, non-`Value`-based, RAUW via
> `ReplaceableMetadataImpl` (`ValueAsMetadata` uses the same).
>
> `CloneAliasScopeMetadata()` should use `TrackingMDRef` in place of
> `TrackingVH<MDNode>`. `TrackingMDRef` will register itself with the
> `Metadata` if it's replaceable, and if/when it gets RAUW'ed, the
> pointer
> will get updated.
>
> If you have another look at the patch it might be more clear now.
Yes, thanks!
>
> BTW, another thing I added in that sketch was the option to
> explicitly
> request a non-uniqued `MDNode`. Haven't thought through details, but
> I
> was specifically thinking this would be a cleaner way to create your
> non-uniquable alias nodes (instead of the current self-referential
> approach).
>
> My working straw man for assembly syntax looks like this:
>
> !1 = metadata distinct !{ ... }
>
> As an example, the alias "root" nodes could change from this:
>
> !1 = metadata !{ metadata !1 }
>
> to this:
>
> !1 = metadata distinct !{}
>
> Which means constructing them would change from this:
>
> MDNode *T = MDNode::getTemporary(Context, None)
> MDNode *N = MDNode::get(Context, {T});
> T->replaceAllUsesWith(N);
> MDNode::deleteTemporary(T);
>
> to this:
>
> // In that patch it's "getNonUniqued()".
> MDNode *N = MDNode::getDistinct(Context, None);
>
> Furthermore, if all references to the alias root got dropped, they'd
> clean themselves up instead of keeping each other alive in a cycle.
>
This sounds like a great improvement!
-Hal
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list