aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-01-11 22:16:13 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-01-11 22:16:13 +0000
commitb2c6d4957a5594311952477473fc6a9bdf3476d0 (patch)
treea3d3a3bd107d73fdcd102690be83707c5f63e506 /utils
parent67f92a76497d1f50e0dd6279c81b45689bd463f5 (diff)
downloadexternal_llvm-b2c6d4957a5594311952477473fc6a9bdf3476d0.zip
external_llvm-b2c6d4957a5594311952477473fc6a9bdf3476d0.tar.gz
external_llvm-b2c6d4957a5594311952477473fc6a9bdf3476d0.tar.bz2
Some minor fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25227 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp45
1 files changed, 19 insertions, 26 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 228f6bf..fe429f0 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -2128,10 +2128,11 @@ public:
}
// Emit all the chain and CopyToReg stuff.
+ bool ChainEmitted = HasChain;
if (HasChain)
OS << " Chain = Select(Chain);\n";
if (HasImpInputs)
- EmitCopyToRegs(Pattern, "N", HasChain, true);
+ EmitCopyToRegs(Pattern, "N", ChainEmitted, true);
if (HasInFlag || HasOptInFlag) {
unsigned FlagNo = (unsigned) HasChain + Pattern->getNumChildren();
if (HasOptInFlag)
@@ -2199,11 +2200,10 @@ public:
<< ValNo + (unsigned)HasChain << ");\n";
if (HasImpResults) {
- if (EmitCopyFromRegs(N, HasChain)) {
+ if (EmitCopyFromRegs(N, ChainEmitted)) {
OS << " CodeGenMap[N.getValue(" << ValNo << ")] = "
<< "Result.getValue(" << ValNo << ");\n";
ValNo++;
- HasChain = true;
}
}
@@ -2314,14 +2314,14 @@ private:
/// EmitCopyToRegs - Emit the flag operands for the DAG that is
/// being built.
void EmitCopyToRegs(TreePatternNode *N, const std::string &RootName,
- bool HasChain, bool isRoot = false) {
+ bool &ChainEmitted, bool isRoot = false) {
const CodeGenTarget &T = ISE.getTargetInfo();
unsigned OpNo =
(unsigned) NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {
TreePatternNode *Child = N->getChild(i);
if (!Child->isLeaf()) {
- EmitCopyToRegs(Child, RootName + utostr(OpNo), HasChain);
+ EmitCopyToRegs(Child, RootName + utostr(OpNo), ChainEmitted);
} else {
if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) {
Record *RR = DI->getDef();
@@ -2329,7 +2329,11 @@ private:
MVT::ValueType RVT = getRegisterValueType(RR, T);
if (RVT == MVT::Flag) {
OS << " InFlag = Select(" << RootName << OpNo << ");\n";
- } else if (HasChain) {
+ } else {
+ if (!ChainEmitted) {
+ OS << " SDOperand Chain = CurDAG->getEntryNode();\n";
+ ChainEmitted = true;
+ }
OS << " SDOperand " << RootName << "CR" << i << ";\n";
OS << " " << RootName << "CR" << i
<< " = CurDAG->getCopyToReg(Chain, CurDAG->getRegister("
@@ -2340,12 +2344,6 @@ private:
<< ".getValue(0);\n";
OS << " InFlag = " << RootName << "CR" << i
<< ".getValue(1);\n";
- } else {
- OS << " InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode()"
- << ", CurDAG->getRegister(" << ISE.getQualifiedName(RR)
- << ", MVT::" << getEnumName(RVT) << ")"
- << ", Select(" << RootName << OpNo
- << "), InFlag).getValue(1);\n";
}
}
}
@@ -2356,7 +2354,7 @@ private:
/// EmitCopyFromRegs - Emit code to copy result to physical registers
/// as specified by the instruction. It returns true if any copy is
/// emitted.
- bool EmitCopyFromRegs(TreePatternNode *N, bool HasChain) {
+ bool EmitCopyFromRegs(TreePatternNode *N, bool &ChainEmitted) {
bool RetVal = false;
Record *Op = N->getOperator();
if (Op->isSubClassOf("Instruction")) {
@@ -2369,20 +2367,15 @@ private:
if (RR->isSubClassOf("Register")) {
MVT::ValueType RVT = getRegisterValueType(RR, CGT);
if (RVT != MVT::Flag) {
- if (HasChain) {
- OS << " Result = CurDAG->getCopyFromReg(Chain, "
- << ISE.getQualifiedName(RR)
- << ", MVT::" << getEnumName(RVT) << ", InFlag);\n";
- OS << " Chain = Result.getValue(1);\n";
- OS << " InFlag = Result.getValue(2);\n";
- } else {
- OS << " Chain;\n";
- OS << " Result = CurDAG->getCopyFromReg("
- << "CurDAG->getEntryNode(), ISE.getQualifiedName(RR)"
- << ", MVT::" << getEnumName(RVT) << ", InFlag);\n";
- OS << " Chain = Result.getValue(1);\n";
- OS << " InFlag = Result.getValue(2);\n";
+ if (!ChainEmitted) {
+ OS << " SDOperand Chain = CurDAG->getEntryNode();\n";
+ ChainEmitted = true;
}
+ OS << " Result = CurDAG->getCopyFromReg(Chain, "
+ << ISE.getQualifiedName(RR)
+ << ", MVT::" << getEnumName(RVT) << ", InFlag);\n";
+ OS << " Chain = Result.getValue(1);\n";
+ OS << " InFlag = Result.getValue(2);\n";
RetVal = true;
}
}