aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-03-20 06:04:09 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-03-20 06:04:09 +0000
commit420132e1eb1ee1002d79c9605ddbe21d9f686f6b (patch)
treef1930009238c61008fe596231f4b4ccf5c55f4a0
parentfa818d0b8bbaadac9834697e95a1652f1acae376 (diff)
Copy matching pattern's output type info to instruction result pattern.
The instruction patterns do not contain enough information to resolve the exact type of the destination if it of a generic vector type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26892 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp17
-rw-r--r--utils/TableGen/DAGISelEmitter.h3
2 files changed, 14 insertions, 6 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 4b8ea20e27..e66223e53e 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -1105,7 +1105,7 @@ static bool HandleUse(TreePattern *I, TreePatternNode *Pat,
void DAGISelEmitter::
FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
std::map<std::string, TreePatternNode*> &InstInputs,
- std::map<std::string, Record*> &InstResults,
+ std::map<std::string, TreePatternNode*> &InstResults,
std::vector<Record*> &InstImpInputs,
std::vector<Record*> &InstImpResults) {
if (Pat->isLeaf()) {
@@ -1159,7 +1159,7 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
I->error("set destination must have a name!");
if (InstResults.count(Dest->getName()))
I->error("cannot set '" + Dest->getName() +"' multiple times");
- InstResults[Dest->getName()] = Val->getDef();
+ InstResults[Dest->getName()] = Dest;
} else if (Val->getDef()->isSubClassOf("Register")) {
InstImpResults.push_back(Val->getDef());
} else {
@@ -1235,7 +1235,7 @@ void DAGISelEmitter::ParseInstructions() {
// InstResults - Keep track of all the virtual registers that are 'set'
// in the instruction, including what reg class they are.
- std::map<std::string, Record*> InstResults;
+ std::map<std::string, TreePatternNode*> InstResults;
std::vector<Record*> InstImpInputs;
std::vector<Record*> InstImpResults;
@@ -1265,6 +1265,7 @@ void DAGISelEmitter::ParseInstructions() {
// Check that all of the results occur first in the list.
std::vector<Record*> Results;
+ TreePatternNode *Res0Node = NULL;
for (unsigned i = 0; i != NumResults; ++i) {
if (i == CGI.OperandList.size())
I->error("'" + InstResults.begin()->first +
@@ -1272,7 +1273,10 @@ void DAGISelEmitter::ParseInstructions() {
const std::string &OpName = CGI.OperandList[i].Name;
// Check that it exists in InstResults.
- Record *R = InstResults[OpName];
+ TreePatternNode *RNode = InstResults[OpName];
+ if (i == 0)
+ Res0Node = RNode;
+ Record *R = dynamic_cast<DefInit*>(RNode->getLeafValue())->getDef();
if (R == 0)
I->error("Operand $" + OpName + " should be a set destination: all "
"outputs must occur before inputs in operand list!");
@@ -1337,6 +1341,9 @@ void DAGISelEmitter::ParseInstructions() {
TreePatternNode *ResultPattern =
new TreePatternNode(I->getRecord(), ResultNodeOperands);
+ // Copy fully inferred output node type to instruction result pattern.
+ if (NumResults > 0)
+ ResultPattern->setTypes(Res0Node->getExtTypes());
// Create and insert the instruction.
DAGInstruction TheInst(I, Results, Operands, InstImpResults, InstImpInputs);
@@ -1407,7 +1414,7 @@ void DAGISelEmitter::ParsePatterns() {
// Validate that the input pattern is correct.
{
std::map<std::string, TreePatternNode*> InstInputs;
- std::map<std::string, Record*> InstResults;
+ std::map<std::string, TreePatternNode*> InstResults;
std::vector<Record*> InstImpInputs;
std::vector<Record*> InstImpResults;
FindPatternInputsAndOutputs(Pattern, Pattern->getOnlyTree(),
diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h
index 6add8b28e4..35606f7787 100644
--- a/utils/TableGen/DAGISelEmitter.h
+++ b/utils/TableGen/DAGISelEmitter.h
@@ -469,7 +469,8 @@ private:
void FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
std::map<std::string,
TreePatternNode*> &InstInputs,
- std::map<std::string, Record*> &InstResults,
+ std::map<std::string,
+ TreePatternNode*> &InstResults,
std::vector<Record*> &InstImpInputs,
std::vector<Record*> &InstImpResults);
void GenerateCodeForPattern(PatternToMatch &Pattern,