diff options
| -rw-r--r-- | llvm/include/llvm/IR/Verifier.h | 6 | ||||
| -rw-r--r-- | llvm/lib/IR/Verifier.cpp | 19 |
2 files changed, 20 insertions, 5 deletions
diff --git a/llvm/include/llvm/IR/Verifier.h b/llvm/include/llvm/IR/Verifier.h index c074af1b173..7efca7865e6 100644 --- a/llvm/include/llvm/IR/Verifier.h +++ b/llvm/include/llvm/IR/Verifier.h @@ -50,6 +50,10 @@ class TBAAVerifier { typedef std::pair<bool, unsigned> TBAABaseNodeSummary; DenseMap<MDNode *, TBAABaseNodeSummary> TBAABaseNodes; + /// Maps an alleged scalar TBAA node to a boolean that is true if the said + /// TBAA node is a valid scalar TBAA node or false otherwise. + DenseMap<const MDNode *, bool> TBAAScalarNodes; + /// \name Helper functions used by \c visitTBAAMetadata. /// @{ MDNode *getFieldNodeFromTBAABaseNode(Instruction &I, MDNode *BaseNode, @@ -57,6 +61,8 @@ class TBAAVerifier { TBAAVerifier::TBAABaseNodeSummary verifyTBAABaseNode(Instruction &I, MDNode *BaseNode); TBAABaseNodeSummary verifyTBAABaseNodeImpl(Instruction &I, MDNode *BaseNode); + + bool isValidScalarTBAANode(const MDNode *MD); /// @} public: diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 8c91f1ee9e1..d42f5d090d1 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4655,9 +4655,18 @@ static bool IsScalarTBAANodeImpl(const MDNode *MD, (IsRootTBAANode(Parent) || IsScalarTBAANodeImpl(Parent, Visited)); } -static bool IsScalarTBAANode(const MDNode *MD) { +bool TBAAVerifier::isValidScalarTBAANode(const MDNode *MD) { + auto ResultIt = TBAAScalarNodes.find(MD); + if (ResultIt != TBAAScalarNodes.end()) + return ResultIt->second; + SmallPtrSet<const MDNode *, 4> Visited; - return IsScalarTBAANodeImpl(MD, Visited); + bool Result = IsScalarTBAANodeImpl(MD, Visited); + auto InsertResult = TBAAScalarNodes.insert({MD, Result}); + (void)InsertResult; + assert(InsertResult.second && "Just checked!"); + + return Result; } /// Returns the field node at the offset \p Offset in \p BaseNode. Update \p @@ -4735,8 +4744,8 @@ bool TBAAVerifier::visitTBAAMetadata(Instruction &I, MDNode *MD) { "should be non-null and point to Metadata nodes", &I, MD, BaseNode, AccessType); - AssertTBAA(IsScalarTBAANode(AccessType), "Access type node must be scalar", - &I, MD, AccessType); + AssertTBAA(isValidScalarTBAANode(AccessType), + "Access type node must be scalar", &I, MD, AccessType); auto *OffsetCI = mdconst::dyn_extract_or_null<ConstantInt>(MD->getOperand(2)); AssertTBAA(OffsetCI, "Offset must be constant integer", &I, MD); @@ -4764,7 +4773,7 @@ bool TBAAVerifier::visitTBAAMetadata(Instruction &I, MDNode *MD) { SeenAccessTypeInPath |= BaseNode == AccessType; - if (IsScalarTBAANode(BaseNode) || BaseNode == AccessType) + if (isValidScalarTBAANode(BaseNode) || BaseNode == AccessType) AssertTBAA(Offset == 0, "Offset not zero at the point of scalar access", &I, MD, &Offset); |

