From 9e00ec6195795806652b11ddd7e9ffda0935d7e1 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 19 Aug 2015 17:40:19 +0000 Subject: [PATCH] [AArch64] Improve short-form diags on long-form Match_InvalidOperand. 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. llvm-svn: 245469 --- .../AArch64/AsmParser/AArch64AsmParser.cpp | 28 ++++++++++++------- llvm/test/MC/AArch64/noneon-diagnostics.s | 15 ++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 9292f660735a..20db170fb3ec 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -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"); diff --git a/llvm/test/MC/AArch64/noneon-diagnostics.s b/llvm/test/MC/AArch64/noneon-diagnostics.s index 60a5fd208af9..309df3697df8 100644 --- a/llvm/test/MC/AArch64/noneon-diagnostics.s +++ b/llvm/test/MC/AArch64/noneon-diagnostics.s @@ -26,4 +26,19 @@ // 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: ^