[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp DAGISelEmitter.h
Chris Lattner
lattner at cs.uiuc.edu
Thu Sep 15 14:51:25 PDT 2005
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.29 -> 1.30
DAGISelEmitter.h updated: 1.17 -> 1.18
---
Log message:
when parsing instructions remember information about the types taken and
returned.
---
Diffs of the changes: (+25 -7)
DAGISelEmitter.cpp | 10 +++++++---
DAGISelEmitter.h | 22 ++++++++++++++++++----
2 files changed, 25 insertions(+), 7 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.29 llvm/utils/TableGen/DAGISelEmitter.cpp:1.30
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.29 Thu Sep 15 16:42:00 2005
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Sep 15 16:51:12 2005
@@ -805,6 +805,7 @@
CodeGenInstruction &CGI = Target.getInstruction(Instrs[i]->getName());
// Check that all of the results occur first in the list.
+ std::vector<MVT::ValueType> ResultTypes;
for (unsigned i = 0; i != NumResults; ++i) {
if (i == CGI.OperandList.size())
I->error("'" + InstResults.begin()->first +
@@ -820,6 +821,9 @@
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 @@
std::map<std::string, TreePatternNode*> InstInputsCheck(InstInputs);
std::vector<TreePatternNode*> ResultNodeOperands;
+ std::vector<MVT::ValueType> 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 @@
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 @@
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));
}
Index: llvm/utils/TableGen/DAGISelEmitter.h
diff -u llvm/utils/TableGen/DAGISelEmitter.h:1.17 llvm/utils/TableGen/DAGISelEmitter.h:1.18
--- llvm/utils/TableGen/DAGISelEmitter.h:1.17 Wed Sep 14 21:38:02 2005
+++ llvm/utils/TableGen/DAGISelEmitter.h Thu Sep 15 16:51:12 2005
@@ -279,16 +279,30 @@
TreePattern *Pattern;
unsigned NumResults;
unsigned NumOperands;
+ std::vector<MVT::ValueType> ResultTypes;
+ std::vector<MVT::ValueType> OperandTypes;
TreePatternNode *ResultPattern;
public:
- DAGInstruction(TreePattern *TP, unsigned results, unsigned ops,
+ DAGInstruction(TreePattern *TP,
+ const std::vector<MVT::ValueType> &resultTypes,
+ const std::vector<MVT::ValueType> &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; }
};
More information about the llvm-commits
mailing list