memoize translations
authorChris Lattner <sabre@nondot.org>
Sat, 24 Sep 2005 00:50:51 +0000 (00:50 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 24 Sep 2005 00:50:51 +0000 (00:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23419 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index 06150d088753c4276f6554c0102bf71b4ae098f8..d5153caa2e02f89a3e89b861dc94429723a7bbaf 100644 (file)
@@ -1153,6 +1153,9 @@ void DAGISelEmitter::EmitCodeForPattern(PatternToMatch &Pattern,
   
   unsigned TmpNo = 0;
   unsigned Res = CodeGenPatternResult(Pattern.second, TmpNo, VariableMap, OS);
+  
+  // Add the result to the map if it has multiple uses.
+  OS << "      if (!N.Val->hasOneUse()) CodeGenMap[N] = Tmp" << Res << ";\n";
   OS << "      return Tmp" << Res << ";\n";
   OS << "    }\n  P" << PatternNo << "Fail:\n";
 }
@@ -1199,6 +1202,10 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
      << "  if (N.getOpcode() >= ISD::BUILTIN_OP_END &&\n"
      << "      N.getOpcode() < PPCISD::FIRST_NUMBER)\n"
      << "    return N;   // Already selected.\n\n"
+     << "  if (!N.Val->hasOneUse()) {\n"
+  << "    std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);\n"
+     << "    if (CGMI != CodeGenMap.end()) return CGMI->second;\n"
+     << "  }\n"
      << "  switch (N.getOpcode()) {\n"
      << "  default: break;\n"
      << "  case ISD::EntryToken:       // These leaves remain the same.\n"
@@ -1250,6 +1257,10 @@ void DAGISelEmitter::run(std::ostream &OS) {
      << "// *** instruction selector class.  These functions are really "
      << "methods.\n\n";
   
+  OS << "// Instance var to keep track of multiply used nodes that have \n"
+     << "// already been selected.\n"
+     << "std::map<SDOperand, SDOperand> CodeGenMap;\n";
+  
   ParseNodeInfo();
   ParseNodeTransforms(OS);
   ParsePatternFragments(OS);