[AArch64] Improve short-form diags on long-form Match_InvalidOperand.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Wed, 19 Aug 2015 17:40:19 +0000 (17:40 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Wed, 19 Aug 2015 17:40:19 +0000 (17:40 +0000)
Since r244955, we try to use the short-form ErrorInfo when both
tries failed, and the long-form match failed on a suffix operand.
However, this means we sometimes mix ErrorInfo and MatchResult
(one manifestation of this being PR24498). Instead, restore both.

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

lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
test/MC/AArch64/noneon-diagnostics.s

index 9292f660735a5714dd32e9f471d33f4c3042b9c8..20db170fb3ecb9af182bf4c61d4e3b0d1269f9b0 100644 (file)
@@ -3929,12 +3929,27 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
 
   // If that fails, try against the alternate table containing long-form NEON:
   // "fadd v0.2s, v1.2s, v2.2s"
-  // But first, save the ErrorInfo: we can use it in case this try also fails.
-  uint64_t ShortFormNEONErrorInfo = ErrorInfo;
-  if (MatchResult != Match_Success)
+  if (MatchResult != Match_Success) {
+    // But first, save the short-form match result: we can use it in case the
+    // long-form match also fails.
+    auto ShortFormNEONErrorInfo = ErrorInfo;
+    auto ShortFormNEONMatchResult = MatchResult;
+
     MatchResult =
         MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm, 0);
 
+    // Now, both matches failed, and the long-form match failed on the mnemonic
+    // suffix token operand.  The short-form match failure is probably more
+    // relevant: use it instead.
+    if (MatchResult == Match_InvalidOperand && ErrorInfo == 1 &&
+        ((AArch64Operand &)*Operands[1]).isToken() &&
+        ((AArch64Operand &)*Operands[1]).isTokenSuffix()) {
+      MatchResult = ShortFormNEONMatchResult;
+      ErrorInfo = ShortFormNEONErrorInfo;
+    }
+  }
+
+
   switch (MatchResult) {
   case Match_Success: {
     // Perform range checking and other semantic validations
@@ -3969,13 +3984,6 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
   case Match_InvalidOperand: {
     SMLoc ErrorLoc = IDLoc;
 
-    // If the long-form match failed on the mnemonic suffix token operand,
-    // the short-form match failure is probably more relevant: use it instead.
-    if (ErrorInfo == 1 &&
-        ((AArch64Operand &)*Operands[1]).isToken() &&
-        ((AArch64Operand &)*Operands[1]).isTokenSuffix())
-      ErrorInfo = ShortFormNEONErrorInfo;
-
     if (ErrorInfo != ~0ULL) {
       if (ErrorInfo >= Operands.size())
         return Error(IDLoc, "too few operands for instruction");
index 60a5fd208af9a3fb34be828407ad187038e7f7bc..309df3697df862a91cb2387d6d32efe5d144ebc0 100644 (file)
 // CHECK-ERROR-NEXT:    ^
 // CHECK-ERROR-NEXT: error: instruction requires: neon
 // CHECK-ERROR-NEXT:    fmls v9.2s, v9.2s, v0.2s
+// CHECK-ERROR-NEXT:    ^
+
+
+        fmls.4s v3, v12, v17
+        fmls.2d v1, v30, v20
+        fmls.2s v9, v9, v0
+
+// CHECK-ERROR: error: instruction requires: neon
+// CHECK-ERROR-NEXT:    fmls.4s v3, v12, v17
+// CHECK-ERROR-NEXT:    ^
+// CHECK-ERROR-NEXT: error: instruction requires: neon
+// CHECK-ERROR-NEXT:    fmls.2d v1, v30, v20
+// CHECK-ERROR-NEXT:    ^
+// CHECK-ERROR-NEXT: error: instruction requires: neon
+// CHECK-ERROR-NEXT:    fmls.2s v9, v9, v0
 // CHECK-ERROR-NEXT:    ^