[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
This commit is contained in:
Ahmed Bougacha 2015-08-19 17:40:19 +00:00
parent 92499e455e
commit 9e00ec6195
2 changed files with 33 additions and 10 deletions

View File

@ -3929,12 +3929,27 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
// If that fails, try against the alternate table containing long-form NEON: // If that fails, try against the alternate table containing long-form NEON:
// "fadd v0.2s, v1.2s, v2.2s" // "fadd v0.2s, v1.2s, v2.2s"
// But first, save the ErrorInfo: we can use it in case this try also fails. if (MatchResult != Match_Success) {
uint64_t ShortFormNEONErrorInfo = ErrorInfo; // But first, save the short-form match result: we can use it in case the
if (MatchResult != Match_Success) // long-form match also fails.
auto ShortFormNEONErrorInfo = ErrorInfo;
auto ShortFormNEONMatchResult = MatchResult;
MatchResult = MatchResult =
MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm, 0); 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) { switch (MatchResult) {
case Match_Success: { case Match_Success: {
// Perform range checking and other semantic validations // Perform range checking and other semantic validations
@ -3969,13 +3984,6 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
case Match_InvalidOperand: { case Match_InvalidOperand: {
SMLoc ErrorLoc = IDLoc; 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 != ~0ULL) {
if (ErrorInfo >= Operands.size()) if (ErrorInfo >= Operands.size())
return Error(IDLoc, "too few operands for instruction"); return Error(IDLoc, "too few operands for instruction");

View File

@ -26,4 +26,19 @@
// CHECK-ERROR-NEXT: ^ // CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: instruction requires: neon // CHECK-ERROR-NEXT: error: instruction requires: neon
// CHECK-ERROR-NEXT: fmls v9.2s, v9.2s, v0.2s // 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: ^ // CHECK-ERROR-NEXT: ^