Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.281 -> 1.282 --- Log message: Fix a bug handling nodes with variable arguments. The code was fixed to assume that there were two input operands before the variable operand portion. This *happened* to be true for all call instructions, which took a chain and a destination, but was not true for the PPC BCTRL instruction, whose destination is implicit. Making this code more general allows elimination of the custom selection logic for BCTRL. --- Diffs of the changes: (+15 -8) DAGISelEmitter.cpp | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.281 llvm/utils/TableGen/DAGISelEmitter.cpp:1.282 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.281 Wed Nov 8 17:01:03 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Nov 14 12:41:38 2006 @@ -2852,6 +2852,11 @@ if (NodeHasOutFlag) Code += ", MVT::Flag"; + // Figure out how many fixed inputs the node has. This is important to + // know which inputs are the variable ones if present. + unsigned NumInputs = AllOps.size(); + NumInputs += NodeHasChain; + // Inputs. if (HasVarOps) { for (unsigned i = 0, e = AllOps.size(); i != e; ++i) @@ -2860,15 +2865,17 @@ } if (HasVarOps) { + // Figure out whether any operands at the end of the op list are not + // part of the variable section. + std::string EndAdjust; if (NodeHasInFlag || HasImpInputs) - emitCode("for (unsigned i = 2, e = N.getNumOperands()-1; " - "i != e; ++i) {"); - else if (NodeHasOptInFlag) - emitCode("for (unsigned i = 2, e = N.getNumOperands()-" - "(HasInFlag?1:0); i != e; ++i) {"); - else - emitCode("for (unsigned i = 2, e = N.getNumOperands(); " - "i != e; ++i) {"); + EndAdjust = "-1"; // Always has one flag. + else if (NodeHasOptInFlag) + EndAdjust = "-(HasInFlag?1:0)"; // May have a flag. + + emitCode("for (unsigned i = " + utostr(NumInputs) + + ", e = N.getNumOperands()" + EndAdjust + "; i != e; ++i) {"); + emitCode(" AddToISelQueue(N.getOperand(i));"); emitCode(" Ops" + utostr(OpsNo) + ".push_back(N.getOperand(i));"); emitCode("}"); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits