summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-02-09 00:37:58 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-02-09 00:37:58 +0000
commit34167215a8da717b21e44f1b834dc34d15279bf1 (patch)
treebdd120daa88d9f0e5bab1b660edc730d10d1b9d6 /utils
parent418caa135640833fda641997dae657062dccf0f4 (diff)
downloadllvm-34167215a8da717b21e44f1b834dc34d15279bf1.tar.gz
llvm-34167215a8da717b21e44f1b834dc34d15279bf1.tar.bz2
llvm-34167215a8da717b21e44f1b834dc34d15279bf1.tar.xz
Change Select() from
SDOperand Select(SDOperand N); to void Select(SDOperand &Result, SDOperand N); git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26067 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp167
1 files changed, 98 insertions, 69 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 8b19d04b3d..2e06f71f3d 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -2196,13 +2196,13 @@ public:
emitCheck(Code + ")");
for (unsigned i = 0; i < NumRes; ++i)
- emitCode("Tmp" + utostr(i+ResNo) + " = Select(Tmp" +
+ emitCode("Select(Tmp" + utostr(i+ResNo) + ", Tmp" +
utostr(i+ResNo) + ");");
TmpNo = ResNo + NumRes;
} else {
emitDecl("Tmp" + utostr(ResNo));
- emitCode("Tmp" + utostr(ResNo) + " = Select(" + Val + ");");
+ emitCode("Select(Tmp" + utostr(ResNo) + ", " + Val + ");");
}
// Add Tmp<ResNo> to VariableMap, so that we don't multiply select this
// value if used multiple times by this pattern result.
@@ -2301,7 +2301,7 @@ public:
// Emit all the chain and CopyToReg stuff.
bool ChainEmitted = HasChain;
if (HasChain)
- emitCode(ChainName + " = Select(" + ChainName + ");");
+ emitCode("Select(" + ChainName + ", " + ChainName + ");");
if (HasInFlag || HasOptInFlag || HasImpInputs)
EmitInFlagSelectCode(Pattern, "N", ChainEmitted, true);
@@ -2329,9 +2329,7 @@ public:
utostr(NumResults) + ");");
}
} else if (HasChain || NodeHasOutFlag) {
- emitDecl("Result");
if (HasOptInFlag) {
- emitCode("Result = SDOperand(0, 0);");
unsigned FlagNo = (unsigned) NodeHasChain + Pattern->getNumChildren();
emitCode("if (HasOptInFlag)");
std::string Code = " Result = CurDAG->getTargetNode(" +
@@ -2445,21 +2443,21 @@ public:
if (AddedChain && NodeHasOutFlag) {
if (NumExpectedResults == 0) {
- emitCode("return Result.getValue(N.ResNo+1);");
+ emitCode("Result = Result.getValue(N.ResNo+1);");
} else {
emitCode("if (N.ResNo < " + utostr(NumExpectedResults) + ")");
- emitCode(" return Result.getValue(N.ResNo);");
+ emitCode(" Result = Result.getValue(N.ResNo);");
emitCode("else");
- emitCode(" return Result.getValue(N.ResNo+1);");
+ emitCode(" Result = Result.getValue(N.ResNo+1);");
}
} else {
- emitCode("return Result.getValue(N.ResNo);");
+ emitCode("Result = Result.getValue(N.ResNo);");
}
} else {
// If this instruction is the root, and if there is only one use of it,
// use SelectNodeTo instead of getTargetNode to avoid an allocation.
emitCode("if (N.Val->hasOneUse()) {");
- std::string Code = " return CurDAG->SelectNodeTo(N.Val, " +
+ std::string Code = " Result = CurDAG->SelectNodeTo(N.Val, " +
II.Namespace + "::" + II.TheDef->getName();
if (N->getTypeNum(0) != MVT::isVoid)
Code += ", MVT::" + getEnumName(N->getTypeNum(0));
@@ -2471,7 +2469,7 @@ public:
Code += ", InFlag";
emitCode(Code + ");");
emitCode("} else {");
- Code = " return CodeGenMap[N] = CurDAG->getTargetNode(" +
+ Code = " Result = CodeGenMap[N] = CurDAG->getTargetNode(" +
II.Namespace + "::" + II.TheDef->getName();
if (N->getTypeNum(0) != MVT::isVoid)
Code += ", MVT::" + getEnumName(N->getTypeNum(0));
@@ -2485,6 +2483,8 @@ public:
emitCode("}");
}
+ if (isRoot)
+ emitCode("return;");
return std::make_pair(1, ResNo);
} else if (Op->isSubClassOf("SDNodeXForm")) {
assert(N->getNumChildren() == 1 && "node xform should have one child!");
@@ -2495,7 +2495,8 @@ public:
+ "(Tmp" + utostr(OpVal) + ".Val);");
if (isRoot) {
emitCode("CodeGenMap[N] = Tmp" +utostr(ResNo) + ";");
- emitCode("return Tmp" + utostr(ResNo) + ";");
+ emitCode("Result = Tmp" + utostr(ResNo) + ";");
+ emitCode("return;");
}
return std::make_pair(1, ResNo);
} else {
@@ -2556,7 +2557,7 @@ private:
if (RR->isSubClassOf("Register")) {
MVT::ValueType RVT = getRegisterValueType(RR, T);
if (RVT == MVT::Flag) {
- emitCode("InFlag = Select(" + RootName + utostr(OpNo) + ");");
+ emitCode("Select(InFlag, " + RootName + utostr(OpNo) + ");");
} else {
if (!ChainEmitted) {
emitDecl("Chain");
@@ -2564,16 +2565,15 @@ private:
ChainName = "Chain";
ChainEmitted = true;
}
- emitDecl(RootName + "CR" + utostr(i));
- emitCode(RootName + "CR" + utostr(i) +
- " = CurDAG->getCopyToReg(" + ChainName +
+ emitCode("Select(" + RootName + utostr(OpNo) + ", " +
+ RootName + utostr(OpNo) + ");");
+ emitDecl("Copy");
+ emitCode("Copy = CurDAG->getCopyToReg(" + ChainName +
", CurDAG->getRegister(" + ISE.getQualifiedName(RR) +
- ", MVT::" + getEnumName(RVT) + "), Select(" + RootName +
- utostr(OpNo) + "), InFlag);");
- emitCode(ChainName + " = " + RootName + "CR" + utostr(i) +
- ".getValue(0);");
- emitCode("InFlag = " + RootName + "CR" + utostr(i) +
- ".getValue(1);");
+ ", MVT::" + getEnumName(RVT) + "), " +
+ RootName + utostr(OpNo) + ", InFlag);");
+ emitCode(ChainName + " = Copy.getValue(0);");
+ emitCode("InFlag = Copy.getValue(1);");
}
}
}
@@ -2587,8 +2587,8 @@ private:
") {");
Code = " ";
}
- emitCode(Code + "InFlag = Select(" + RootName + ".getOperand(" +
- utostr(OpNo) + "));");
+ emitCode(Code + "Select(InFlag, " + RootName +
+ ".getOperand(" + utostr(OpNo) + "));");
if (HasOptInFlag) {
emitCode(" HasOptInFlag = true;");
emitCode("}");
@@ -2866,7 +2866,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
CompareByRecordName>::iterator PBOI = PatternsByOpcode.begin(),
E = PatternsByOpcode.end(); PBOI != E; ++PBOI) {
const std::string &OpName = PBOI->first->getName();
- OS << "SDOperand Select_" << OpName << "(SDOperand N) {\n";
+ OS << "void Select_" << OpName << "(SDOperand &Result, SDOperand N) {\n";
const SDNodeInfo &OpcodeInfo = getSDNodeInfo(PBOI->first);
bool OptSlctOrder =
@@ -2874,7 +2874,6 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
OpcodeInfo.getNumResults() > 0);
if (OptSlctOrder) {
- OS << " SDOperand RetVal;\n";
OS << " if (N.ResNo == " << OpcodeInfo.getNumResults()
<< " && N.getValue(0).hasOneUse()) {\n"
<< " SDOperand Dummy = "
@@ -2883,7 +2882,8 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
<< ")] = Dummy;\n"
<< " HandleMap[N.getValue(" << OpcodeInfo.getNumResults()
<< ")] = Dummy;\n"
- << " return Dummy;\n"
+ << " Result = Dummy;\n"
+ << " return;\n"
<< " }\n";
}
@@ -2935,7 +2935,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
// Print all declarations.
for (std::set<std::string>::iterator I = GeneratedDecl.begin(),
E = GeneratedDecl.end(); I != E; ++I)
- OS << " SDOperand " << *I << ";\n";
+ OS << " SDOperand " << *I << "(0, 0);\n";
// Loop through and reverse all of the CodeList vectors, as we will be
// accessing them from their logical front, but accessing the end of a
@@ -2963,29 +2963,35 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
}
// Emit boilerplate.
- OS << "SDOperand Select_INLINEASM(SDOperand N) {\n"
+ OS << "void Select_INLINEASM(SDOperand& Result, SDOperand N) {\n"
<< " std::vector<SDOperand> Ops(N.Val->op_begin(), N.Val->op_end());\n"
- << " Ops[0] = Select(N.getOperand(0)); // Select the chain.\n\n"
+ << " Select(Ops[0], N.getOperand(0)); // Select the chain.\n\n"
<< " // Select the flag operand.\n"
<< " if (Ops.back().getValueType() == MVT::Flag)\n"
- << " Ops.back() = Select(Ops.back());\n"
+ << " Select(Ops.back(), Ops.back());\n"
<< " std::vector<MVT::ValueType> VTs;\n"
<< " VTs.push_back(MVT::Other);\n"
<< " VTs.push_back(MVT::Flag);\n"
<< " SDOperand New = CurDAG->getNode(ISD::INLINEASM, VTs, Ops);\n"
<< " CodeGenMap[N.getValue(0)] = New;\n"
<< " CodeGenMap[N.getValue(1)] = New.getValue(1);\n"
- << " return New.getValue(N.ResNo);\n"
+ << " Result = New.getValue(N.ResNo);\n"
+ << " return;\n"
<< "}\n\n";
OS << "// The main instruction selector code.\n"
- << "SDOperand SelectCode(SDOperand N) {\n"
+ << "void SelectCode(SDOperand &Result, SDOperand N) {\n"
<< " if (N.getOpcode() >= ISD::BUILTIN_OP_END &&\n"
<< " N.getOpcode() < (ISD::BUILTIN_OP_END+" << InstNS
- << "INSTRUCTION_LIST_END))\n"
- << " return N; // Already selected.\n\n"
+ << "INSTRUCTION_LIST_END)) {\n"
+ << " Result = N;\n"
+ << " return; // Already selected.\n"
+ << " }\n\n"
<< " std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);\n"
- << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n"
+ << " if (CGMI != CodeGenMap.end()) {\n"
+ << " Result = CGMI->second;\n"
+ << " return;\n"
+ << " }\n\n"
<< " switch (N.getOpcode()) {\n"
<< " default: break;\n"
<< " case ISD::EntryToken: // These leaves remain the same.\n"
@@ -2995,71 +3001,91 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
<< " case ISD::TargetConstant:\n"
<< " case ISD::TargetConstantPool:\n"
<< " case ISD::TargetFrameIndex:\n"
- << " case ISD::TargetGlobalAddress:\n"
- << " return N;\n"
+ << " case ISD::TargetGlobalAddress: {\n"
+ << " Result = N;\n"
+ << " return;\n"
+ << " }\n"
<< " case ISD::AssertSext:\n"
<< " case ISD::AssertZext: {\n"
- << " SDOperand Tmp0 = Select(N.getOperand(0));\n"
+ << " SDOperand Tmp0;\n"
+ << " Select(Tmp0, N.getOperand(0));\n"
<< " if (!N.Val->hasOneUse()) CodeGenMap[N] = Tmp0;\n"
- << " return Tmp0;\n"
+ << " Result = Tmp0;\n"
+ << " return;\n"
<< " }\n"
<< " case ISD::TokenFactor:\n"
<< " if (N.getNumOperands() == 2) {\n"
- << " SDOperand Op0 = Select(N.getOperand(0));\n"
- << " SDOperand Op1 = Select(N.getOperand(1));\n"
- << " return CodeGenMap[N] =\n"
+ << " SDOperand Op0, Op1;\n"
+ << " Select(Op0, N.getOperand(0));\n"
+ << " Select(Op1, N.getOperand(1));\n"
+ << " Result = CodeGenMap[N] =\n"
<< " CurDAG->getNode(ISD::TokenFactor, MVT::Other, Op0, Op1);\n"
<< " } else {\n"
<< " std::vector<SDOperand> Ops;\n"
- << " for (unsigned i = 0, e = N.getNumOperands(); i != e; ++i)\n"
- << " Ops.push_back(Select(N.getOperand(i)));\n"
- << " return CodeGenMap[N] = \n"
+ << " for (unsigned i = 0, e = N.getNumOperands(); i != e; ++i) {\n"
+ << " SDOperand Val;\n"
+ << " Select(Val, N.getOperand(i));\n"
+ << " Ops.push_back(Val);\n"
+ << " }\n"
+ << " Result = CodeGenMap[N] = \n"
<< " CurDAG->getNode(ISD::TokenFactor, MVT::Other, Ops);\n"
<< " }\n"
+ << " return;\n"
<< " case ISD::CopyFromReg: {\n"
- << " SDOperand Chain = Select(N.getOperand(0));\n"
+ << " SDOperand Chain;\n"
+ << " Select(Chain, N.getOperand(0));\n"
<< " unsigned Reg = cast<RegisterSDNode>(N.getOperand(1))->getReg();\n"
<< " MVT::ValueType VT = N.Val->getValueType(0);\n"
<< " if (N.Val->getNumValues() == 2) {\n"
- << " if (Chain == N.getOperand(0)) return N; // No change\n"
+ << " if (Chain == N.getOperand(0)) {\n"
+ << " Result = N; // No change\n"
+ << " return;\n"
+ << " }\n"
<< " SDOperand New = CurDAG->getCopyFromReg(Chain, Reg, VT);\n"
<< " CodeGenMap[N.getValue(0)] = New;\n"
<< " CodeGenMap[N.getValue(1)] = New.getValue(1);\n"
- << " return New.getValue(N.ResNo);\n"
+ << " Result = New.getValue(N.ResNo);\n"
+ << " return;\n"
<< " } else {\n"
- << " SDOperand Flag(0, 0);\n"
- << " if (N.getNumOperands() == 3) Flag = Select(N.getOperand(2));\n"
+ << " SDOperand Flag;\n"
+ << " if (N.getNumOperands() == 3) Select(Flag, N.getOperand(2));\n"
<< " if (Chain == N.getOperand(0) &&\n"
- << " (N.getNumOperands() == 2 || Flag == N.getOperand(2)))\n"
- << " return N; // No change\n"
+ << " (N.getNumOperands() == 2 || Flag == N.getOperand(2))) {\n"
+ << " Result = N; // No change\n"
+ << " return;\n"
+ << " }\n"
<< " SDOperand New = CurDAG->getCopyFromReg(Chain, Reg, VT, Flag);\n"
<< " CodeGenMap[N.getValue(0)] = New;\n"
<< " CodeGenMap[N.getValue(1)] = New.getValue(1);\n"
<< " CodeGenMap[N.getValue(2)] = New.getValue(2);\n"
- << " return New.getValue(N.ResNo);\n"
+ << " Result = New.getValue(N.ResNo);\n"
+ << " return;\n"
<< " }\n"
<< " }\n"
<< " case ISD::CopyToReg: {\n"
- << " SDOperand Chain = Select(N.getOperand(0));\n"
+ << " SDOperand Chain;\n"
+ << " Select(Chain, N.getOperand(0));\n"
<< " unsigned Reg = cast<RegisterSDNode>(N.getOperand(1))->getReg();\n"
- << " SDOperand Val = Select(N.getOperand(2));\n"
- << " SDOperand Result = N;\n"
+ << " SDOperand Val;\n"
+ << " Select(Val, N.getOperand(2));\n"
+ << " SDOperand ResNode = N;\n"
<< " if (N.Val->getNumValues() == 1) {\n"
<< " if (Chain != N.getOperand(0) || Val != N.getOperand(2))\n"
- << " Result = CurDAG->getCopyToReg(Chain, Reg, Val);\n"
- << " return CodeGenMap[N] = Result;\n"
+ << " ResNode = CurDAG->getCopyToReg(Chain, Reg, Val);\n"
+ << " Result = CodeGenMap[N] = ResNode;\n"
<< " } else {\n"
<< " SDOperand Flag(0, 0);\n"
- << " if (N.getNumOperands() == 4) Flag = Select(N.getOperand(3));\n"
+ << " if (N.getNumOperands() == 4) Select(Flag, N.getOperand(3));\n"
<< " if (Chain != N.getOperand(0) || Val != N.getOperand(2) ||\n"
<< " (N.getNumOperands() == 4 && Flag != N.getOperand(3)))\n"
- << " Result = CurDAG->getCopyToReg(Chain, Reg, Val, Flag);\n"
- << " CodeGenMap[N.getValue(0)] = Result;\n"
- << " CodeGenMap[N.getValue(1)] = Result.getValue(1);\n"
- << " return Result.getValue(N.ResNo);\n"
+ << " ResNode = CurDAG->getCopyToReg(Chain, Reg, Val, Flag);\n"
+ << " CodeGenMap[N.getValue(0)] = ResNode;\n"
+ << " CodeGenMap[N.getValue(1)] = ResNode.getValue(1);\n"
+ << " Result = ResNode.getValue(N.ResNo);\n"
<< " }\n"
+ << " return;\n"
<< " }\n"
- << " case ISD::INLINEASM: return Select_INLINEASM(N);\n";
+ << " case ISD::INLINEASM: Select_INLINEASM(Result, N); return;\n";
// Loop over all of the case statements, emiting a call to each method we
@@ -3070,7 +3096,7 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
const SDNodeInfo &OpcodeInfo = getSDNodeInfo(PBOI->first);
OS << " case " << OpcodeInfo.getEnumName() << ": "
<< std::string(std::max(0, int(24-OpcodeInfo.getEnumName().size())), ' ')
- << "return Select_" << PBOI->first->getName() << "(N);\n";
+ << "Select_" << PBOI->first->getName() << "(Result, N); return;\n";
}
OS << " } // end of big switch.\n\n"
@@ -3151,7 +3177,9 @@ void DAGISelEmitter::run(std::ostream &OS) {
<< "HandleMap.begin(),\n"
<< " E = HandleMap.end(); I != E; ++I) {\n";
OS << " SDOperand N = I->first;\n";
- OS << " AddHandleReplacement(N, Select(N.getValue(0)));\n";
+ OS << " SDOperand R;\n";
+ OS << " Select(R, N.getValue(0));\n";
+ OS << " AddHandleReplacement(N, R);\n";
OS << " }\n";
OS << "}\n";
OS << "\n";
@@ -3183,11 +3211,12 @@ void DAGISelEmitter::run(std::ostream &OS) {
OS << "\n";
OS << "// SelectRoot - Top level entry to DAG isel.\n";
OS << "SDOperand SelectRoot(SDOperand N) {\n";
- OS << " SDOperand RetVal = Select(N);\n";
+ OS << " SDOperand ResNode;\n";
+ OS << " Select(ResNode, N);\n";
OS << " SelectDanglingHandles();\n";
OS << " ReplaceHandles();\n";
OS << " ReplaceMap.clear();\n";
- OS << " return RetVal;\n";
+ OS << " return ResNode;\n";
OS << "}\n";
ParseNodeInfo();