Author: Piotr Zegar Date: 2023-05-06T12:22:28Z New Revision: c3d16514d061be30636eca89a8a8a35d06847fe0
URL: https://github.com/llvm/llvm-project/commit/c3d16514d061be30636eca89a8a8a35d06847fe0 DIFF: https://github.com/llvm/llvm-project/commit/c3d16514d061be30636eca89a8a8a35d06847fe0.diff LOG: [clang][NFC] Optimize clang::ASTNodeKind::isBaseOf Create dedicated isBaseOf method without calculating distance. Tested on RISCVISelDAGToDAG.cpp with: clang-tidy --checks=*,-bugprone-unchecked-optional-access Amount of CPU cycles for isBaseOf reduced by ~15% (according to perf). Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D149518 Added: Modified: clang/include/clang/AST/ASTTypeTraits.h clang/lib/AST/ASTTypeTraits.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ASTTypeTraits.h b/clang/include/clang/AST/ASTTypeTraits.h index 8713221a73780..78661823ca858 100644 --- a/clang/include/clang/AST/ASTTypeTraits.h +++ b/clang/include/clang/AST/ASTTypeTraits.h @@ -77,10 +77,13 @@ class ASTNodeKind { /// Returns \c true only for the default \c ASTNodeKind() constexpr bool isNone() const { return KindId == NKI_None; } + /// Returns \c true if \c this is a base kind of (or same as) \c Other. + bool isBaseOf(ASTNodeKind Other) const; + /// Returns \c true if \c this is a base kind of (or same as) \c Other. /// \param Distance If non-null, used to return the distance between \c this /// and \c Other in the class hierarchy. - bool isBaseOf(ASTNodeKind Other, unsigned *Distance = nullptr) const; + bool isBaseOf(ASTNodeKind Other, unsigned *Distance) const; /// String representation of the kind. StringRef asStringRef() const; @@ -166,6 +169,10 @@ class ASTNodeKind { /// Use getFromNodeKind<T>() to construct the kind. constexpr ASTNodeKind(NodeKindId KindId) : KindId(KindId) {} + /// Returns \c true if \c Base is a base kind of (or same as) \c + /// Derived. + static bool isBaseOf(NodeKindId Base, NodeKindId Derived); + /// Returns \c true if \c Base is a base kind of (or same as) \c /// Derived. /// \param Distance If non-null, used to return the distance between \c Base diff --git a/clang/lib/AST/ASTTypeTraits.cpp b/clang/lib/AST/ASTTypeTraits.cpp index 64823f77e58a1..fb9fe39e7778d 100644 --- a/clang/lib/AST/ASTTypeTraits.cpp +++ b/clang/lib/AST/ASTTypeTraits.cpp @@ -56,10 +56,23 @@ const ASTNodeKind::KindInfo ASTNodeKind::AllKindInfo[] = { {NKI_None, "ObjCProtocolLoc"}, }; +bool ASTNodeKind::isBaseOf(ASTNodeKind Other) const { + return isBaseOf(KindId, Other.KindId); +} + bool ASTNodeKind::isBaseOf(ASTNodeKind Other, unsigned *Distance) const { return isBaseOf(KindId, Other.KindId, Distance); } +bool ASTNodeKind::isBaseOf(NodeKindId Base, NodeKindId Derived) { + if (Base == NKI_None || Derived == NKI_None) + return false; + while (Derived != Base && Derived != NKI_None) { + Derived = AllKindInfo[Derived].ParentId; + } + return Derived == Base; +} + bool ASTNodeKind::isBaseOf(NodeKindId Base, NodeKindId Derived, unsigned *Distance) { if (Base == NKI_None || Derived == NKI_None) return false; @@ -96,7 +109,7 @@ ASTNodeKind ASTNodeKind::getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind ASTNodeKind::getMostDerivedCommonAncestor(ASTNodeKind Kind1, ASTNodeKind Kind2) { NodeKindId Parent = Kind1.KindId; - while (!isBaseOf(Parent, Kind2.KindId, nullptr) && Parent != NKI_None) { + while (!isBaseOf(Parent, Kind2.KindId) && Parent != NKI_None) { Parent = AllKindInfo[Parent].ParentId; } return ASTNodeKind(Parent); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits