[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Evan Cheng
evan.cheng at apple.com
Mon Dec 12 11:37:55 PST 2005
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.94 -> 1.95
---
Log message:
Bug fix: finding the correct incoming chain for pattern with nested src operand. And a minor change to make output code slightly more readible.
---
Diffs of the changes: (+17 -14)
DAGISelEmitter.cpp | 31 +++++++++++++++++--------------
1 files changed, 17 insertions(+), 14 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.94 llvm/utils/TableGen/DAGISelEmitter.cpp:1.95
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.94 Fri Dec 9 20:36:00 2005
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 12 13:37:43 2005
@@ -1040,14 +1040,15 @@
for (unsigned i = 0; i != NumValues; ++i) {
TreePatternNode *Dest = Pat->getChild(i);
if (!Dest->isLeaf())
- I->error("set destination should be a virtual register!");
+ I->error("set destination should be a register!");
DefInit *Val = dynamic_cast<DefInit*>(Dest->getLeafValue());
if (!Val)
- I->error("set destination should be a virtual register!");
+ I->error("set destination should be a register!");
- if (!Val->getDef()->isSubClassOf("RegisterClass"))
- I->error("set destination should be a virtual register!");
+ if (!Val->getDef()->isSubClassOf("RegisterClass") &&
+ !Val->getDef()->isSubClassOf("Register"))
+ I->error("set destination should be a register!");
if (Dest->getName().empty())
I->error("set destination must have a name!");
if (InstResults.count(Dest->getName()))
@@ -1726,10 +1727,9 @@
std::ostream &OS;
// Node to name mapping
std::map<std::string,std::string> VariableMap;
- // Name of the inner most node which produces a chain.
- std::string InnerChain;
// Names of all the folded nodes which produce chains.
std::vector<std::string> FoldedChains;
+ bool FoundChain;
bool InFlag;
unsigned TmpNo;
@@ -1737,7 +1737,7 @@
PatternCodeEmitter(DAGISelEmitter &ise, TreePatternNode *lhs,
unsigned PatNum, std::ostream &os) :
ISE(ise), LHS(lhs), PatternNo(PatNum), OS(os),
- InFlag(false), TmpNo(0) {};
+ FoundChain(false), InFlag(false), TmpNo(0) {};
/// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo
/// if the match fails. At this point, we already know that the opcode for N
@@ -1776,7 +1776,8 @@
// Emit code to load the child nodes and match their contents recursively.
unsigned OpNo = 0;
- if (NodeHasChain(N, ISE)) {
+ bool HasChain = NodeHasChain(N, ISE);
+ if (HasChain) {
OpNo = 1;
if (!isRoot) {
const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
@@ -1786,11 +1787,6 @@
<< ".getValue(" << CInfo.getNumResults() << "))) goto P"
<< PatternNo << "Fail; // Already selected for a chain use?\n";
}
- if (InnerChain.empty()) {
- OS << " SDOperand " << RootName << "0 = " << RootName
- << ".getOperand(0);\n";
- InnerChain = RootName + "0";
- }
}
for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {
@@ -1862,6 +1858,13 @@
}
}
+ if (HasChain) {
+ if (!FoundChain) {
+ OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n";
+ FoundChain = true;
+ }
+ }
+
// If there is a node predicate for this, emit the call.
if (!N->getPredicateFn().empty())
OS << " if (!" << N->getPredicateFn() << "(" << RootName
@@ -1988,7 +1991,7 @@
// Emit all the chain and CopyToReg stuff.
if (II.hasCtrlDep)
- OS << " SDOperand Chain = Select(" << InnerChain << ");\n";
+ OS << " Chain = Select(Chain);\n";
EmitCopyToRegs(LHS, "N", II.hasCtrlDep);
const DAGInstruction &Inst = ISE.getInstruction(Op);
More information about the llvm-commits
mailing list