mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Verify that xform functions only occur in logical places
llvm-svn: 23363
This commit is contained in:
parent
6f94c802a2
commit
ab6886a31d
@ -627,8 +627,8 @@ void DAGISelEmitter::ParseAndResolvePatternFragments(std::ostream &OS) {
|
||||
}
|
||||
|
||||
/// HandleUse - Given "Pat" a leaf in the pattern, check to see if it is an
|
||||
/// instruction input.
|
||||
static void HandleUse(TreePattern *I, TreePatternNode *Pat,
|
||||
/// instruction input. Return true if this is a real use.
|
||||
static bool HandleUse(TreePattern *I, TreePatternNode *Pat,
|
||||
std::map<std::string, TreePatternNode*> &InstInputs) {
|
||||
// No name -> not interesting.
|
||||
if (Pat->getName().empty()) {
|
||||
@ -638,7 +638,7 @@ static void HandleUse(TreePattern *I, TreePatternNode *Pat,
|
||||
I->error("Input " + DI->getDef()->getName() + " must be named!");
|
||||
|
||||
}
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
Record *Rec;
|
||||
@ -669,6 +669,7 @@ static void HandleUse(TreePattern *I, TreePatternNode *Pat,
|
||||
if (Slot->getType() != Pat->getType())
|
||||
I->error("All $" + Pat->getName() + " inputs must agree with each other");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// FindPatternInputsAndOutputs - Scan the specified TreePatternNode (which is
|
||||
@ -679,7 +680,9 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
|
||||
std::map<std::string, TreePatternNode*> &InstInputs,
|
||||
std::map<std::string, Record*> &InstResults) {
|
||||
if (Pat->isLeaf()) {
|
||||
HandleUse(I, Pat, InstInputs);
|
||||
bool isUse = HandleUse(I, Pat, InstInputs);
|
||||
if (!isUse && Pat->getTransformFn())
|
||||
I->error("Cannot specify a transform function for a non-input value!");
|
||||
return;
|
||||
} else if (Pat->getOperator()->getName() != "set") {
|
||||
// If this is not a set, verify that the children nodes are not void typed,
|
||||
@ -692,9 +695,12 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
|
||||
|
||||
// If this is a non-leaf node with no children, treat it basically as if
|
||||
// it were a leaf. This handles nodes like (imm).
|
||||
bool isUse = false;
|
||||
if (Pat->getNumChildren() == 0)
|
||||
HandleUse(I, Pat, InstInputs);
|
||||
isUse = HandleUse(I, Pat, InstInputs);
|
||||
|
||||
if (!isUse && Pat->getTransformFn())
|
||||
I->error("Cannot specify a transform function for a non-input value!");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -704,6 +710,9 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
|
||||
else if (Pat->getNumChildren() & 1)
|
||||
I->error("set requires an even number of operands");
|
||||
|
||||
if (Pat->getTransformFn())
|
||||
I->error("Cannot specify a transform function on a set node!");
|
||||
|
||||
// Check the set destinations.
|
||||
unsigned NumValues = Pat->getNumChildren()/2;
|
||||
for (unsigned i = 0; i != NumValues; ++i) {
|
||||
|
Loading…
Reference in New Issue
Block a user