implement a fixme: only select values once, even if used multiple times.
authorChris Lattner <sabre@nondot.org>
Mon, 26 Sep 2005 21:53:26 +0000 (21:53 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Sep 2005 21:53:26 +0000 (21:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23454 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index ae38830a9d173c4c7d4e14a437f0fa694fe48c76..77067806f2d49b21a6ab72287f9ef58c8af7f79b 100644 (file)
@@ -1074,23 +1074,26 @@ void DAGISelEmitter::EmitMatchForPattern(TreePatternNode *N,
        << ".Val)) goto P" << PatternNo << "Fail;\n";
 }
 
-
+/// CodeGenPatternResult - Emit the action for a pattern.  Now that it has
+/// matched, we actually have to build a DAG!
 unsigned DAGISelEmitter::
 CodeGenPatternResult(TreePatternNode *N, unsigned &Ctr,
                      std::map<std::string,std::string> &VariableMap, 
-                     std::ostream &OS){
+                     std::ostream &OS) {
   // This is something selected from the pattern we matched.
   if (!N->getName().empty()) {
-    const std::string &Val = VariableMap[N->getName()];
+    std::string &Val = VariableMap[N->getName()];
     assert(!Val.empty() &&
            "Variable referenced but not defined and not caught earlier!");
     if (Val[0] == 'T' && Val[1] == 'm' && Val[2] == 'p') {
       // Already selected this operand, just return the tmpval.
-      // FIXME: DO THIS.
+      return atoi(Val.c_str()+3);
     } else {
       unsigned ResNo = Ctr++;
       OS << "      SDOperand Tmp" << ResNo << " = Select(" << Val << ");\n";
-      // FIXME: Add Tmp<ResNo> to VariableMap.
+      // 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);
       return ResNo;
     }
   }