From 6be48d49cf0d48045463b74f4b35c5215edd3e57 Mon Sep 17 00:00:00 2001 From: Scott Michel Date: Tue, 29 Jan 2008 02:29:31 +0000 Subject: [PATCH] Fix to bug 1951: tblgen gratuitously renames variables when no temporary was generated. This feature would only show up in fairly complex patterns, such as this one in CellSPU: def : Pat<(add (SPUhi tconstpool:$in, 0), (SPUlo tconstpool:$in, 0)), (IOHLlo (ILHUhi tconstpool:$in), tconstpool:$in)>; which generated the following emit code: SDNode *Emit_0(const SDOperand &N, unsigned Opc0, unsigned Opc1, MVT::ValueType VT0, MVT::ValueType VT1) DISABLE_INLINE { SDOperand N0 = N.getOperand(0); SDOperand N00 = N0.getOperand(0); SDOperand N01 = N0.getOperand(1); SDOperand N1 = N.getOperand(1); SDOperand N10 = N1.getOperand(0); SDOperand N11 = N1.getOperand(1); SDOperand Tmp3(CurDAG->getTargetNode(Opc0, VT0, N00), 0); return CurDAG->SelectNodeTo(N.Val, Opc1, VT1, Tmp3, Tmp2); /* Tmp2 s/b N00 */ } Tested against the test suites without incident. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46487 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/DAGISelEmitter.cpp | 48 +++++++++++++++++-------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 8502d6197a7..79d8e3d2dc9 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -694,7 +694,9 @@ public: std::vector NodeOps; // This is something selected from the pattern we matched. if (!N->getName().empty()) { - std::string &Val = VariableMap[N->getName()]; + const std::string &VarName = N->getName(); + std::string Val = VariableMap[VarName]; + bool ModifiedVal = false; assert(!Val.empty() && "Variable referenced but not defined and not caught earlier!"); if (Val[0] == 'T' && Val[1] == 'm' && Val[2] == 'p') { @@ -708,6 +710,7 @@ public: if (!N->isLeaf() && N->getOperator()->getName() == "imm") { assert(N->getExtTypes().size() == 1 && "Multiple types not handled!"); std::string CastType; + std::string TmpVar = "Tmp" + utostr(ResNo); switch (N->getTypeNum(0)) { default: cerr << "Cannot handle " << getEnumName(N->getTypeNum(0)) @@ -719,56 +722,53 @@ public: case MVT::i32: CastType = "unsigned"; break; case MVT::i64: CastType = "uint64_t"; break; } - emitCode("SDOperand Tmp" + utostr(ResNo) + + emitCode("SDOperand " + TmpVar + " = CurDAG->getTargetConstant(((" + CastType + ") cast(" + Val + ")->getValue()), " + getEnumName(N->getTypeNum(0)) + ");"); - NodeOps.push_back("Tmp" + utostr(ResNo)); // Add Tmp to VariableMap, so that we don't multiply select this // value if used multiple times by this pattern result. - Val = "Tmp"+utostr(ResNo); + Val = TmpVar; + ModifiedVal = true; + NodeOps.push_back(Val); } else if (!N->isLeaf() && N->getOperator()->getName() == "texternalsym"){ Record *Op = OperatorMap[N->getName()]; // Transform ExternalSymbol to TargetExternalSymbol if (Op && Op->getName() == "externalsym") { - emitCode("SDOperand Tmp" + utostr(ResNo) + " = CurDAG->getTarget" + std::string TmpVar = "Tmp"+utostr(ResNo); + emitCode("SDOperand " + TmpVar + " = CurDAG->getTarget" "ExternalSymbol(cast(" + Val + ")->getSymbol(), " + getEnumName(N->getTypeNum(0)) + ");"); - NodeOps.push_back("Tmp" + utostr(ResNo)); // Add Tmp to VariableMap, so that we don't multiply select // this value if used multiple times by this pattern result. - Val = "Tmp"+utostr(ResNo); - } else { - NodeOps.push_back(Val); + Val = TmpVar; + ModifiedVal = true; } + NodeOps.push_back(Val); } else if (!N->isLeaf() && (N->getOperator()->getName() == "tglobaladdr" || N->getOperator()->getName() == "tglobaltlsaddr")) { Record *Op = OperatorMap[N->getName()]; // Transform GlobalAddress to TargetGlobalAddress if (Op && (Op->getName() == "globaladdr" || Op->getName() == "globaltlsaddr")) { - emitCode("SDOperand Tmp" + utostr(ResNo) + " = CurDAG->getTarget" + std::string TmpVar = "Tmp" + utostr(ResNo); + emitCode("SDOperand " + TmpVar + " = CurDAG->getTarget" "GlobalAddress(cast(" + Val + ")->getGlobal(), " + getEnumName(N->getTypeNum(0)) + ");"); - NodeOps.push_back("Tmp" + utostr(ResNo)); // Add Tmp to VariableMap, so that we don't multiply select // this value if used multiple times by this pattern result. - Val = "Tmp"+utostr(ResNo); - } else { - NodeOps.push_back(Val); + Val = TmpVar; + ModifiedVal = true; } - } else if (!N->isLeaf() && N->getOperator()->getName() == "texternalsym"){ NodeOps.push_back(Val); - // Add Tmp to VariableMap, so that we don't multiply select this - // value if used multiple times by this pattern result. - Val = "Tmp"+utostr(ResNo); - } else if (!N->isLeaf() && N->getOperator()->getName() == "tconstpool") { + } else if (!N->isLeaf() + && (N->getOperator()->getName() == "texternalsym" + || N->getOperator()->getName() == "tconstpool")) { + // Do not rewrite the variable name, since we don't generate a new + // temporary. NodeOps.push_back(Val); - // Add Tmp to VariableMap, so that we don't multiply select this - // value if used multiple times by this pattern result. - Val = "Tmp"+utostr(ResNo); } else if (N->isLeaf() && (CP = NodeGetComplexPattern(N, CGP))) { for (unsigned i = 0; i < CP->getNumOperands(); ++i) { emitCode("AddToISelQueue(CPTmp" + utostr(i) + ");"); @@ -786,6 +786,10 @@ public: } NodeOps.push_back(Val); } + + if (ModifiedVal) { + VariableMap[VarName] = Val; + } return NodeOps; } if (N->isLeaf()) { -- 2.34.1