Prefer diagnostics from target predicate in asm matcher.
authorJim Grosbach <grosbach@apple.com>
Tue, 16 Aug 2011 20:12:35 +0000 (20:12 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 16 Aug 2011 20:12:35 +0000 (20:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137742 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/AsmMatcherEmitter.cpp

index da1be260762aaf6db79af16b320fc1f56a8cb75c..558db7b15c1453389cc43ebaeb73e4a3053b9281 100644 (file)
@@ -2349,6 +2349,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
 
   OS << "  // Some state to try to produce better error messages.\n";
   OS << "  bool HadMatchOtherThanFeatures = false;\n";
+  OS << "  bool HadMatchOtherThanPredicate = false;\n";
   OS << "  unsigned RetCode = Match_InvalidOperand;\n";
   OS << "  // Set ErrorInfo to the operand that mismatches if it is\n";
   OS << "  // wrong for all instances of the instruction.\n";
@@ -2413,6 +2414,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
      << " Match_Success) {\n"
      << "      Inst.clear();\n"
      << "      RetCode = MatchResult;\n"
+     << "      HadMatchOtherThanPredicate = true;\n"
      << "      continue;\n"
      << "    }\n\n";
 
@@ -2426,8 +2428,9 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
   OS << "  }\n\n";
 
   OS << "  // Okay, we had no match.  Try to return a useful error code.\n";
-  OS << "  if (HadMatchOtherThanFeatures) return Match_MissingFeature;\n";
-  OS << "  return RetCode;\n";
+  OS << "  if (HadMatchOtherThanPredicate || !HadMatchOtherThanFeatures)";
+  OS << " return RetCode;\n";
+  OS << "  return Match_MissingFeature;\n";
   OS << "}\n\n";
 
   if (Info.OperandMatchInfo.size())