r233228 - Keep track of canonical decls in Redeclarable.

Sean Silva chisophugis at gmail.com
Wed Mar 25 18:01:47 PDT 2015


On Wed, Mar 25, 2015 at 5:56 PM, Sean Silva <chisophugis at gmail.com> wrote:

> Awesome performance numbers!
>
> When we discussed this previously, one alternative (should we ever need
> it; not sure we do) if the memory overhead is excessive is to use a
> waymarking scheme to find the canonical decl in constant time (unlike Use
> http://www.llvm.org/docs/ProgrammersManual.html#the-waymarking-algorithm
> , we don't have random access, but we can instead take advantage of the
> stable address of the canonical decl and directly store bits of the stable
> address).
>

D'oh, just saw the review thread and
https://llvm.org/bugs/show_bug.cgi?id=21264 where Richard suggests a more
elaborate (but not guaranteed constant time?) scheme.

-- Sean Silva


>
> -- Sean Silva
>
> On Wed, Mar 25, 2015 at 4:18 PM, Manuel Klimek <klimek at google.com> wrote:
>
>> Author: klimek
>> Date: Wed Mar 25 18:18:30 2015
>> New Revision: 233228
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=233228&view=rev
>> Log:
>> Keep track of canonical decls in Redeclarable.
>>
>> More than 2x speedup on modules builds with large redecl chains.
>> Roughly 15-20% speedup on non-modules builds for very large TUs.
>> Between 2-3% cost in memory on large TUs.
>>
>> Modified:
>>     cfe/trunk/include/clang/AST/Decl.h
>>     cfe/trunk/include/clang/AST/Redeclarable.h
>>     cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/Decl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=233228&r1=233227&r2=233228&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>> +++ cfe/trunk/include/clang/AST/Decl.h Wed Mar 25 18:18:30 2015
>> @@ -3738,8 +3738,6 @@ void Redeclarable<decl_type>::setPreviou
>>    assert(RedeclLink.NextIsLatest() &&
>>           "setPreviousDecl on a decl already in a redeclaration chain");
>>
>> -  decl_type *First;
>> -
>>    if (PrevDecl) {
>>      // Point to previous. Make sure that this is actually the most recent
>>      // redeclaration, or we can build invalid chains. If the most recent
>>
>> Modified: cfe/trunk/include/clang/AST/Redeclarable.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Redeclarable.h?rev=233228&r1=233227&r2=233228&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/Redeclarable.h (original)
>> +++ cfe/trunk/include/clang/AST/Redeclarable.h Wed Mar 25 18:18:30 2015
>> @@ -121,14 +121,15 @@ protected:
>>    ///
>>    /// If there is only one declaration, it is <pointer to self, true>
>>    DeclLink RedeclLink;
>> +  decl_type *First;
>>
>>    decl_type *getNextRedeclaration() const {
>>      return RedeclLink.getNext(static_cast<const decl_type *>(this));
>>    }
>>
>>  public:
>> -  Redeclarable(const ASTContext &Ctx)
>> -      : RedeclLink(LatestDeclLink(Ctx)) {}
>> + Redeclarable(const ASTContext &Ctx)
>> +     : RedeclLink(LatestDeclLink(Ctx)), First(static_cast<decl_type
>> *>(this)) {}
>>
>>    /// \brief Return the previous declaration of this declaration or NULL
>> if this
>>    /// is the first declaration.
>> @@ -144,21 +145,11 @@ public:
>>
>>    /// \brief Return the first declaration of this declaration or itself
>> if this
>>    /// is the only declaration.
>> -  decl_type *getFirstDecl() {
>> -    decl_type *D = static_cast<decl_type*>(this);
>> -    while (D->getPreviousDecl())
>> -      D = D->getPreviousDecl();
>> -    return D;
>> -  }
>> +  decl_type *getFirstDecl() { return First; }
>>
>>    /// \brief Return the first declaration of this declaration or itself
>> if this
>>    /// is the only declaration.
>> -  const decl_type *getFirstDecl() const {
>> -    const decl_type *D = static_cast<const decl_type*>(this);
>> -    while (D->getPreviousDecl())
>> -      D = D->getPreviousDecl();
>> -    return D;
>> -  }
>> +  const decl_type *getFirstDecl() const { return First; }
>>
>>    /// \brief True if this is the first declaration in its redeclaration
>> chain.
>>    bool isFirstDecl() const { return RedeclLink.NextIsLatest(); }
>>
>> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=233228&r1=233227&r2=233228&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
>> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Mar 25 18:18:30 2015
>> @@ -2106,6 +2106,7 @@ ASTDeclReader::VisitRedeclarable(Redecla
>>      // which is the one that matters and mark the real previous DeclID
>> to be
>>      // loaded & attached later on.
>>      D->RedeclLink = Redeclarable<T>::PreviousDeclLink(FirstDecl);
>> +    D->First = FirstDecl->getCanonicalDecl();
>>    }
>>
>>    // Note that this declaration has been deserialized.
>> @@ -2209,6 +2210,7 @@ void ASTDeclReader::mergeRedeclarable(Re
>>      // of the existing declaration, so that this declaration has the
>>      // appropriate canonical declaration.
>>      D->RedeclLink = Redeclarable<T>::PreviousDeclLink(ExistingCanon);
>> +    D->First = ExistingCanon;
>>
>>      // When we merge a namespace, update its pointer to the first
>> namespace.
>>      // We cannot have loaded any redeclarations of this declaration yet,
>> so
>> @@ -2828,6 +2830,7 @@ void ASTDeclReader::attachPreviousDeclIm
>>                                             Redeclarable<DeclT> *D,
>>                                             Decl *Previous, Decl *Canon) {
>>    D->RedeclLink.setPrevious(cast<DeclT>(Previous));
>> +  D->First = cast<DeclT>(Previous)->First;
>>  }
>>  namespace clang {
>>  template<>
>> @@ -2838,6 +2841,7 @@ void ASTDeclReader::attachPreviousDeclIm
>>    FunctionDecl *PrevFD = cast<FunctionDecl>(Previous);
>>
>>    FD->RedeclLink.setPrevious(PrevFD);
>> +  FD->First = PrevFD->First;
>>
>>    // If the previous declaration is an inline function declaration, then
>> this
>>    // declaration is too.
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150325/649e9e5b/attachment.html>


More information about the cfe-commits mailing list