From a27234e290a4809c5a60e28e99f2870142ff3a55 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 23 Feb 2010 07:22:28 +0000 Subject: [PATCH] Reject patterns that use a name multiple times in the src or result of a pattern and where the uses have different types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96904 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/CodeGenDAGPatterns.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp index e27b602a238..3c7c2edae8e 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -2091,20 +2091,21 @@ void CodeGenDAGPatterns::ParseInstructions() { typedef std::pair NameRecord; static void FindNames(const TreePatternNode *P, - std::map &Names) { + std::map &Names, + const TreePattern *PatternTop) { if (!P->getName().empty()) { NameRecord &Rec = Names[P->getName()]; // If this is the first instance of the name, remember the node. if (Rec.second++ == 0) Rec.first = P; -// else -// assert(Rec.first->getExtTypes() == P->getExtTypes() && -// "Type mismatch on name repetition"); + else if (Rec.first->getExtTypes() != P->getExtTypes()) + PatternTop->error("repetition of value: $" + P->getName() + + " where different uses have different types!"); } if (!P->isLeaf()) { for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i) - FindNames(P->getChild(i), Names); + FindNames(P->getChild(i), Names, PatternTop); } } @@ -2118,8 +2119,8 @@ void CodeGenDAGPatterns::AddPatternToMatch(const TreePattern *Pattern, // Find all of the named values in the input and output, ensure they have the // same type. std::map SrcNames, DstNames; - FindNames(PTM.getSrcPattern(), SrcNames); - FindNames(PTM.getDstPattern(), DstNames); + FindNames(PTM.getSrcPattern(), SrcNames, Pattern); + FindNames(PTM.getDstPattern(), DstNames, Pattern); // Scan all of the named values in the destination pattern, rejecting them if // they don't exist in the input pattern.