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:
|
// 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");
|
||||||
|
|
|
@ -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: ^
|
||||||
|
|
Loading…
Reference in New Issue