From cf899a31aebf60e91a8732c6c5900398797230be Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sun, 18 Apr 2021 20:51:43 -0700 Subject: [PATCH] Add a cache of checked AttributeLists. Differential Revision: https://reviews.llvm.org/D100738 --- llvm/lib/IR/Verifier.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 9d3c791..83a48c4 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -328,6 +328,9 @@ class Verifier : public InstVisitor, VerifierSupport { /// Cache of declarations of the llvm.experimental.deoptimize. intrinsic. SmallVector DeoptimizeDeclarations; + /// Cache of attribute lists verified. + SmallPtrSet AttributeListsVisited; + // Verify that this GlobalValue is only used in this module. // This map is used to avoid visiting uses twice. We can arrive at a user // twice, if they have multiple operands. In particular for very large @@ -1890,14 +1893,16 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs, if (Attrs.isEmpty()) return; - Assert(Attrs.hasParentContext(Context), - "Attribute list does not match Module context!", &Attrs); - for (const auto &AttrSet : Attrs) { - Assert(!AttrSet.hasAttributes() || AttrSet.hasParentContext(Context), - "Attribute set does not match Module context!", &AttrSet); - for (const auto &A : AttrSet) { - Assert(A.hasParentContext(Context), - "Attribute does not match Module context!", &A); + if (AttributeListsVisited.insert(Attrs.getRawPointer()).second) { + Assert(Attrs.hasParentContext(Context), + "Attribute list does not match Module context!", &Attrs); + for (const auto &AttrSet : Attrs) { + Assert(!AttrSet.hasAttributes() || AttrSet.hasParentContext(Context), + "Attribute set does not match Module context!", &AttrSet); + for (const auto &A : AttrSet) { + Assert(A.hasParentContext(Context), + "Attribute does not match Module context!", &A); + } } } -- 2.7.4