Emit memcmp directly from the StringMatcherEmitter.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 May 2012 18:10:42 +0000 (18:10 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 May 2012 18:10:42 +0000 (18:10 +0000)
There should be no difference in the resulting binary, given a sufficiently
smart compiler. However we already had compiler timeouts on the generated
code in Intrinsics.gen, this hopefully makes the lives of slow buildbots a
little easier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157161 91177308-0d34-0410-b5e6-96231b3b80d8

lib/TableGen/StringMatcher.cpp

index 0ce626d4b19ea2f4102b34a7a095adce6dad2ccd..16681702d1d66cd9da597a813a8fe9508801d5ca 100644 (file)
@@ -87,11 +87,11 @@ EmitStringMatcherForChar(const std::vector<const StringPair*> &Matches,
       << Matches[0]->first[CharNo] << "')\n";
       OS << Indent << "  break;\n";
     } else {
-      // Do the comparison with if (Str.substr(1, 3) != "foo").    
+      // Do the comparison with if memcmp(Str.data()+1, "foo", 3).
       // FIXME: Need to escape general strings.
-      OS << Indent << "if (" << StrVariableName << ".substr(" << CharNo << ", "
-      << NumChars << ") != \"";
-      OS << Matches[0]->first.substr(CharNo, NumChars) << "\")\n";
+      OS << Indent << "if (memcmp(" << StrVariableName << ".data()+" << CharNo
+         << ", \"" << Matches[0]->first.substr(CharNo, NumChars) << "\", "
+         << NumChars << "))\n";
       OS << Indent << "  break;\n";
     }