summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed.bougacha@gmail.com>2015-08-19 17:40:19 +0000
committerAhmed Bougacha <ahmed.bougacha@gmail.com>2015-08-19 17:40:19 +0000
commit9e00ec6195795806652b11ddd7e9ffda0935d7e1 (patch)
treeefdb3f47e52a2f2a20796e883a1f08c7b8ba8db0 /llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
parent92499e455eae105178ff7e084456b3205a310c54 (diff)
downloadbcm5719-llvm-9e00ec6195795806652b11ddd7e9ffda0935d7e1.tar.gz
bcm5719-llvm-9e00ec6195795806652b11ddd7e9ffda0935d7e1.zip
[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
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 9292f660735..20db170fb3e 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");
OpenPOWER on IntegriCloud