diff options
| author | Scott Michel <scottm@aero.org> | 2008-01-29 02:29:31 +0000 | 
|---|---|---|
| committer | Scott Michel <scottm@aero.org> | 2008-01-29 02:29:31 +0000 | 
| commit | 167502a508f6f4e433f0e1af052ee7fbd585775c (patch) | |
| tree | 95afc73c20b95ec11fce9f903a339cc17524ffdd | |
| parent | ef33767efb2e80e9ddadb27a958642eeea777d8a (diff) | |
| download | bcm5719-llvm-167502a508f6f4e433f0e1af052ee7fbd585775c.tar.gz bcm5719-llvm-167502a508f6f4e433f0e1af052ee7fbd585775c.zip | |
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.
llvm-svn: 46487
| -rw-r--r-- | llvm/utils/TableGen/DAGISelEmitter.cpp | 48 | 
1 files changed, 26 insertions, 22 deletions
| diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp index 8502d6197a7..79d8e3d2dc9 100644 --- a/llvm/utils/TableGen/DAGISelEmitter.cpp +++ b/llvm/utils/TableGen/DAGISelEmitter.cpp @@ -694,7 +694,9 @@ public:      std::vector<std::string> 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<ConstantSDNode>(" + Val + ")->getValue()), " +                   getEnumName(N->getTypeNum(0)) + ");"); -        NodeOps.push_back("Tmp" + utostr(ResNo));          // Add Tmp<ResNo> 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<ExternalSymbolSDNode>(" +                     Val + ")->getSymbol(), " +                     getEnumName(N->getTypeNum(0)) + ");"); -          NodeOps.push_back("Tmp" + utostr(ResNo));            // Add Tmp<ResNo> 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<GlobalAddressSDNode>(" + Val +                     ")->getGlobal(), " + getEnumName(N->getTypeNum(0)) +                     ");"); -          NodeOps.push_back("Tmp" + utostr(ResNo));            // Add Tmp<ResNo> 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<ResNo> 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<ResNo> 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()) { | 

