Do not emit getTargetNode() and SelectNodeTo() which takes more than 3

SDOperand arguments. Use the variants which take an array and number instead.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29906 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2006-08-27 08:11:28 +00:00
parent 694481ee01
commit f037ca6245

View File

@ -2583,7 +2583,7 @@ public:
"(N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);"); "(N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);");
} }
if (HasVarOps) if (HasVarOps)
emitCode("SmallVector<SDOperand, 8> Ops;"); emitCode("SmallVector<SDOperand, 8> Ops" + utostr(OpcNo) + ";");
// How many results is this pattern expected to produce? // How many results is this pattern expected to produce?
unsigned PatResults = 0; unsigned PatResults = 0;
@ -2607,15 +2607,17 @@ public:
if (NodeHasInFlag || HasImpInputs) if (NodeHasInFlag || HasImpInputs)
EmitInFlagSelectCode(Pattern, "N", ChainEmitted, EmitInFlagSelectCode(Pattern, "N", ChainEmitted,
InFlagDecled, ResNodeDecled, true); InFlagDecled, ResNodeDecled, true);
if (NodeHasOptInFlag) { if (NodeHasOptInFlag || NodeHasInFlag || HasImpInputs) {
if (!InFlagDecled) { if (!InFlagDecled) {
emitCode("SDOperand InFlag(0, 0);"); emitCode("SDOperand InFlag(0, 0);");
InFlagDecled = true; InFlagDecled = true;
} }
emitCode("if (HasInFlag) {"); if (NodeHasOptInFlag) {
emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);"); emitCode("if (HasInFlag) {");
emitCode(" AddToISelQueue(InFlag);"); emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);");
emitCode("}"); emitCode(" AddToISelQueue(InFlag);");
emitCode("}");
}
} }
unsigned NumResults = Inst.getNumResults(); unsigned NumResults = Inst.getNumResults();
@ -2635,7 +2637,9 @@ public:
else else
Code2 = NodeName + " = "; Code2 = NodeName + " = ";
} }
Code = "CurDAG->getTargetNode(Opc" + utostr(OpcNo); Code = "CurDAG->getTargetNode(Opc" + utostr(OpcNo);
unsigned OpsNo = OpcNo;
emitOpcode(II.Namespace + "::" + II.TheDef->getName()); emitOpcode(II.Namespace + "::" + II.TheDef->getName());
// Output order: results, chain, flags // Output order: results, chain, flags
@ -2650,12 +2654,10 @@ public:
Code += ", MVT::Flag"; Code += ", MVT::Flag";
// Inputs. // Inputs.
for (unsigned i = 0, e = AllOps.size(); i != e; ++i) { if (HasVarOps) {
std::string OpName = AllOps[i]; for (unsigned i = 0, e = AllOps.size(); i != e; ++i)
if (HasVarOps) emitCode("Ops" + utostr(OpsNo) + ".push_back(" + AllOps[i] + ");");
emitCode("Ops.push_back(" + OpName + ");"); AllOps.clear();
else
Code += ", " + OpName;
} }
if (HasVarOps) { if (HasVarOps) {
@ -2669,40 +2671,51 @@ public:
emitCode("for (unsigned i = 2, e = N.getNumOperands(); " emitCode("for (unsigned i = 2, e = N.getNumOperands(); "
"i != e; ++i) {"); "i != e; ++i) {");
emitCode(" AddToISelQueue(N.getOperand(i));"); emitCode(" AddToISelQueue(N.getOperand(i));");
emitCode(" Ops.push_back(N.getOperand(i));"); emitCode(" Ops" + utostr(OpsNo) + ".push_back(N.getOperand(i));");
emitCode("}"); emitCode("}");
} }
if (NodeHasChain) { if (NodeHasChain) {
if (HasVarOps) if (HasVarOps)
emitCode("Ops.push_back(" + ChainName + ");"); emitCode("Ops" + utostr(OpsNo) + ".push_back(" + ChainName + ");");
else else
Code += ", " + ChainName; AllOps.push_back(ChainName);
}
if (NodeHasInFlag || HasImpInputs) {
if (!InFlagDecled) {
emitCode("SDOperand InFlag(0, 0);");
InFlagDecled = true;
}
if (HasVarOps) {
emitCode("Ops.push_back(InFlag);");
} else
Code += ", InFlag";
} else if (NodeHasOptInFlag && HasVarOps) {
if (!InFlagDecled) {
emitCode("SDOperand InFlag(0, 0);");
InFlagDecled = true;
}
emitCode("if (HasInFlag)");
emitCode(" Ops.push_back(InFlag);");
} }
if (HasVarOps) if (HasVarOps) {
Code += ", &Ops[0], Ops.size()"; if (NodeHasInFlag || HasImpInputs)
else if (NodeHasOptInFlag) { emitCode("Ops" + utostr(OpsNo) + ".push_back(InFlag);");
Code = "HasInFlag ? " + Code + ", InFlag) : " + Code; else if (NodeHasOptInFlag) {
} emitCode("if (HasInFlag)");
emitCode(" Ops" + utostr(OpsNo) + ".push_back(InFlag);");
}
Code += ", &Ops" + utostr(OpsNo) + "[0], Ops" + utostr(OpsNo) +
".size()";
} else if (NodeHasInFlag || NodeHasOptInFlag || HasImpInputs)
AllOps.push_back("InFlag");
unsigned NumOps = AllOps.size();
if (NumOps) {
if (!NodeHasOptInFlag && NumOps < 4) {
for (unsigned i = 0; i != NumOps; ++i)
Code += ", " + AllOps[i];
} else {
std::string OpsCode = "SDOperand Ops" + utostr(OpsNo) + "[] = { ";
for (unsigned i = 0; i != NumOps; ++i) {
OpsCode += AllOps[i];
if (i != NumOps-1)
OpsCode += ", ";
}
emitCode(OpsCode + " };");
Code += ", Ops" + utostr(OpsNo) + ", ";
if (NodeHasOptInFlag) {
Code += "HasInFlag ? ";
Code += utostr(NumOps) + " : " + utostr(NumOps-1);
} else
Code += utostr(NumOps);
}
}
if (!isRoot) if (!isRoot)
Code += "), 0"; Code += "), 0";
emitCode(Code2 + Code + ");"); emitCode(Code2 + Code + ");");
@ -2761,9 +2774,8 @@ public:
emitCode("ReplaceUses(SDOperand(N.Val, " + emitCode("ReplaceUses(SDOperand(N.Val, " +
utostr(PatResults) + "), SDOperand(" + ChainName + ".Val, " + utostr(PatResults) + "), SDOperand(" + ChainName + ".Val, " +
ChainName + ".ResNo" + "));"); ChainName + ".ResNo" + "));");
} else { } else
RetSelected = true; RetSelected = true;
}
// User does not expect the instruction would produce a chain! // User does not expect the instruction would produce a chain!
if ((!InputHasChain && NodeHasChain) && NodeHasOutFlag) { if ((!InputHasChain && NodeHasChain) && NodeHasOutFlag) {
@ -2792,10 +2804,27 @@ public:
Code += ", VT" + utostr(VTNo); Code += ", VT" + utostr(VTNo);
if (NodeHasOutFlag) if (NodeHasOutFlag)
Code += ", MVT::Flag"; Code += ", MVT::Flag";
for (unsigned i = 0, e = AllOps.size(); i != e; ++i)
Code += ", " + AllOps[i]; if (NodeHasInFlag || NodeHasOptInFlag || HasImpInputs)
if (NodeHasInFlag || HasImpInputs) AllOps.push_back("InFlag");
Code += ", InFlag";
unsigned NumOps = AllOps.size();
if (NumOps) {
if (!NodeHasOptInFlag && NumOps < 4) {
for (unsigned i = 0; i != NumOps; ++i)
Code += ", " + AllOps[i];
} else {
std::string OpsCode = "SDOperand Ops" + utostr(OpcNo) + "[] = { ";
for (unsigned i = 0; i != NumOps; ++i) {
OpsCode += AllOps[i];
if (i != NumOps-1)
OpsCode += ", ";
}
emitCode(OpsCode + " };");
Code += ", Ops" + utostr(OpcNo) + ", ";
Code += utostr(NumOps);
}
}
emitCode(Code + ");"); emitCode(Code + ");");
emitOpcode(II.Namespace + "::" + II.TheDef->getName()); emitOpcode(II.Namespace + "::" + II.TheDef->getName());
if (N->getTypeNum(0) != MVT::isVoid) if (N->getTypeNum(0) != MVT::isVoid)