diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 8e7569bcfe7..dcdbb1cb6ad 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -805,6 +805,7 @@ void DAGISelEmitter::ParseInstructions() { CodeGenInstruction &CGI = Target.getInstruction(Instrs[i]->getName()); // Check that all of the results occur first in the list. + std::vector ResultTypes; for (unsigned i = 0; i != NumResults; ++i) { if (i == CGI.OperandList.size()) I->error("'" + InstResults.begin()->first + @@ -820,6 +821,9 @@ void DAGISelEmitter::ParseInstructions() { if (CGI.OperandList[i].Rec != R) I->error("Operand $" + OpName + " class mismatch!"); + // Remember the return type. + ResultTypes.push_back(CGI.OperandList[i].Ty); + // Okay, this one checks out. InstResults.erase(OpName); } @@ -829,6 +833,7 @@ void DAGISelEmitter::ParseInstructions() { std::map InstInputsCheck(InstInputs); std::vector ResultNodeOperands; + std::vector OperandTypes; for (unsigned i = NumResults, e = CGI.OperandList.size(); i != e; ++i) { const std::string &OpName = CGI.OperandList[i].Name; if (OpName.empty()) @@ -842,6 +847,7 @@ void DAGISelEmitter::ParseInstructions() { if (CGI.OperandList[i].Ty != InVal->getType()) I->error("Operand $" + OpName + "'s type disagrees between the operand and pattern"); + OperandTypes.push_back(InVal->getType()); // Construct the result for the dest-pattern operand list. TreePatternNode *OpNode = InVal->clone(); @@ -867,10 +873,8 @@ void DAGISelEmitter::ParseInstructions() { TreePatternNode *ResultPattern = new TreePatternNode(I->getRecord(), ResultNodeOperands); - unsigned NumOperands = CGI.OperandList.size()-NumResults; - DEBUG(I->dump()); - Instructions.push_back(DAGInstruction(I, NumResults, NumOperands, + Instructions.push_back(DAGInstruction(I, ResultTypes, OperandTypes, ResultPattern)); } diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h index 280cab35560..a8726d9b8dc 100644 --- a/utils/TableGen/DAGISelEmitter.h +++ b/utils/TableGen/DAGISelEmitter.h @@ -279,16 +279,30 @@ namespace llvm { TreePattern *Pattern; unsigned NumResults; unsigned NumOperands; + std::vector ResultTypes; + std::vector OperandTypes; TreePatternNode *ResultPattern; public: - DAGInstruction(TreePattern *TP, unsigned results, unsigned ops, + DAGInstruction(TreePattern *TP, + const std::vector &resultTypes, + const std::vector &operandTypes, TreePatternNode *resultPattern) - : Pattern(TP), NumResults(results), NumOperands(ops), + : Pattern(TP), ResultTypes(resultTypes), OperandTypes(operandTypes), ResultPattern(resultPattern) {} TreePattern *getPattern() const { return Pattern; } - unsigned getNumResults() const { return NumResults; } - unsigned getNumOperands() const { return NumOperands; } + unsigned getNumResults() const { return ResultTypes.size(); } + unsigned getNumOperands() const { return OperandTypes.size(); } + + MVT::ValueType getResultType(unsigned RN) const { + assert(RN < ResultTypes.size()); + return ResultTypes[RN]; + } + + MVT::ValueType getOperandType(unsigned ON) const { + assert(ON < OperandTypes.size()); + return OperandTypes[ON]; + } TreePatternNode *getResultPattern() const { return ResultPattern; } };