Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.251 -> 1.252 --- Log message: Do not emit getTargetNode() and SelectNodeTo() which takes more than 3 SDOperand arguments. Use the variants which take an array and number instead. --- Diffs of the changes: (+71 -42) DAGISelEmitter.cpp | 113 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 71 insertions(+), 42 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.251 llvm/utils/TableGen/DAGISelEmitter.cpp:1.252 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.251 Sat Aug 26 02:56:39 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Sun Aug 27 03:11:28 2006 @@ -2583,7 +2583,7 @@ "(N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);"); } if (HasVarOps) - emitCode("SmallVector<SDOperand, 8> Ops;"); + emitCode("SmallVector<SDOperand, 8> Ops" + utostr(OpcNo) + ";"); // How many results is this pattern expected to produce? unsigned PatResults = 0; @@ -2607,15 +2607,17 @@ if (NodeHasInFlag || HasImpInputs) EmitInFlagSelectCode(Pattern, "N", ChainEmitted, InFlagDecled, ResNodeDecled, true); - if (NodeHasOptInFlag) { + if (NodeHasOptInFlag || NodeHasInFlag || HasImpInputs) { if (!InFlagDecled) { emitCode("SDOperand InFlag(0, 0);"); InFlagDecled = true; } - emitCode("if (HasInFlag) {"); - emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);"); - emitCode(" AddToISelQueue(InFlag);"); - emitCode("}"); + if (NodeHasOptInFlag) { + emitCode("if (HasInFlag) {"); + emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);"); + emitCode(" AddToISelQueue(InFlag);"); + emitCode("}"); + } } unsigned NumResults = Inst.getNumResults(); @@ -2635,7 +2637,9 @@ else Code2 = NodeName + " = "; } + Code = "CurDAG->getTargetNode(Opc" + utostr(OpcNo); + unsigned OpsNo = OpcNo; emitOpcode(II.Namespace + "::" + II.TheDef->getName()); // Output order: results, chain, flags @@ -2650,12 +2654,10 @@ Code += ", MVT::Flag"; // Inputs. - for (unsigned i = 0, e = AllOps.size(); i != e; ++i) { - std::string OpName = AllOps[i]; - if (HasVarOps) - emitCode("Ops.push_back(" + OpName + ");"); - else - Code += ", " + OpName; + if (HasVarOps) { + for (unsigned i = 0, e = AllOps.size(); i != e; ++i) + emitCode("Ops" + utostr(OpsNo) + ".push_back(" + AllOps[i] + ");"); + AllOps.clear(); } if (HasVarOps) { @@ -2669,40 +2671,51 @@ emitCode("for (unsigned i = 2, e = N.getNumOperands(); " "i != e; ++i) {"); emitCode(" AddToISelQueue(N.getOperand(i));"); - emitCode(" Ops.push_back(N.getOperand(i));"); + emitCode(" Ops" + utostr(OpsNo) + ".push_back(N.getOperand(i));"); emitCode("}"); } if (NodeHasChain) { if (HasVarOps) - emitCode("Ops.push_back(" + ChainName + ");"); + emitCode("Ops" + utostr(OpsNo) + ".push_back(" + ChainName + ");"); else - Code += ", " + ChainName; + AllOps.push_back(ChainName); } - if (NodeHasInFlag || HasImpInputs) { - if (!InFlagDecled) { - emitCode("SDOperand InFlag(0, 0);"); - InFlagDecled = true; + + if (HasVarOps) { + if (NodeHasInFlag || HasImpInputs) + emitCode("Ops" + utostr(OpsNo) + ".push_back(InFlag);"); + else if (NodeHasOptInFlag) { + emitCode("if (HasInFlag)"); + emitCode(" Ops" + utostr(OpsNo) + ".push_back(InFlag);"); } - if (HasVarOps) { - emitCode("Ops.push_back(InFlag);"); - } else - Code += ", InFlag"; - } else if (NodeHasOptInFlag && HasVarOps) { - if (!InFlagDecled) { - emitCode("SDOperand InFlag(0, 0);"); - InFlagDecled = true; + 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); } - emitCode("if (HasInFlag)"); - emitCode(" Ops.push_back(InFlag);"); - } - - if (HasVarOps) - Code += ", &Ops[0], Ops.size()"; - else if (NodeHasOptInFlag) { - Code = "HasInFlag ? " + Code + ", InFlag) : " + Code; } - + if (!isRoot) Code += "), 0"; emitCode(Code2 + Code + ");"); @@ -2761,9 +2774,8 @@ emitCode("ReplaceUses(SDOperand(N.Val, " + utostr(PatResults) + "), SDOperand(" + ChainName + ".Val, " + ChainName + ".ResNo" + "));"); - } else { + } else RetSelected = true; - } // User does not expect the instruction would produce a chain! if ((!InputHasChain && NodeHasChain) && NodeHasOutFlag) { @@ -2792,10 +2804,27 @@ Code += ", VT" + utostr(VTNo); if (NodeHasOutFlag) Code += ", MVT::Flag"; - for (unsigned i = 0, e = AllOps.size(); i != e; ++i) - Code += ", " + AllOps[i]; - if (NodeHasInFlag || HasImpInputs) - Code += ", InFlag"; + + 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(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 + ");"); emitOpcode(II.Namespace + "::" + II.TheDef->getName()); if (N->getTypeNum(0) != MVT::isVoid) _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits