forked from OSchip/llvm-project
[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:
parent
92499e455e
commit
9e00ec6195
|
@ -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");
|
||||
|
|
|
@ -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: ^
|
||||
|
|
Loading…
Reference in New Issue