Skip to content

Commit

Permalink
reject patterns that have dead named arguments in the input pattern
Browse files Browse the repository at this point in the history
this is tidier and can find bugs.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96900 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed Feb 23, 2010
1 parent 6d9f86b commit 4ac7a0c
Showing 1 changed file with 24 additions and 7 deletions.
31 changes: 24 additions & 7 deletions utils/TableGen/CodeGenDAGPatterns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2087,10 +2087,20 @@ void CodeGenDAGPatterns::ParseInstructions() {
}
}


typedef std::pair<const TreePatternNode*, unsigned> NameRecord;

static void FindNames(const TreePatternNode *P,
std::map<std::string, const TreePatternNode*> &Names) {
if (!P->getName().empty())
Names[P->getName()] = P;
std::map<std::string, NameRecord> &Names) {
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");
}

if (!P->isLeaf()) {
for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i)
Expand All @@ -2107,18 +2117,25 @@ 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<std::string, const TreePatternNode*> SrcNames, DstNames;
std::map<std::string, NameRecord> SrcNames, DstNames;
FindNames(PTM.getSrcPattern(), SrcNames);
FindNames(PTM.getDstPattern(), DstNames);

// Scan all of the named values in the destination pattern, rejecting them if
// they don't exist in the input pattern.
for (std::map<std::string, const TreePatternNode*>::iterator
for (std::map<std::string, NameRecord>::iterator
I = DstNames.begin(), E = DstNames.end(); I != E; ++I)
if (SrcNames[I->first] == 0)
if (SrcNames[I->first].first == 0)
Pattern->error("Pattern has input without matching name in output: $" +
I->first);


// Scan all of the named values in the source pattern, rejecting them if the
// name isn't used in the dest, and isn't used to tie two values together.
for (std::map<std::string, NameRecord>::iterator
I = SrcNames.begin(), E = SrcNames.end(); I != E; ++I)
if (DstNames[I->first].first == 0 && SrcNames[I->first].second == 1)
Pattern->error("Pattern has dead named input: $" + I->first);

PatternsToMatch.push_back(PTM);
}

Expand Down

0 comments on commit 4ac7a0c

Please sign in to comment.