[llvm] 3ea7902 - [RISCV] Check S0 register list check for qc.cm.pushfp to after we parsed the whole register list. (#134180)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 2 21:48:51 PDT 2025
Author: Craig Topper
Date: 2025-04-02T21:48:48-07:00
New Revision: 3ea7902494643517c519142002e42a65e81f40d0
URL: https://github.com/llvm/llvm-project/commit/3ea7902494643517c519142002e42a65e81f40d0
DIFF: https://github.com/llvm/llvm-project/commit/3ea7902494643517c519142002e42a65e81f40d0.diff
LOG: [RISCV] Check S0 register list check for qc.cm.pushfp to after we parsed the whole register list. (#134180)
This is more of a semantic check. The diagnostic location to has been
changed to point at the register list start instead of the
closing brace or whatever character might be there instead of a brace
if its malformed.
Added:
Modified:
llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
llvm/test/MC/RISCV/rv32xqccmp-invalid.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index d2af2951add6f..aa41410c735b7 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -2592,20 +2592,8 @@ ParseStatus RISCVAsmParser::parseRegListCommon(OperandVector &Operands,
return Error(getLoc(), "register list must start from 'ra' or 'x1'");
getLexer().Lex();
- bool SeenComma = parseOptionalToken(AsmToken::Comma);
-
- // There are two choices here:
- // - `s0` is not required (usual case), so only try to parse `s0` if there is
- // a comma
- // - `s0` is required (qc.cm.pushfp), and so we must see the comma between
- // `ra` and `s0` and must always try to parse `s0`, below
- if (MustIncludeS0 && !SeenComma) {
- Error(getLoc(), "register list must include 's0' or 'x8'");
- return ParseStatus::Failure;
- }
-
// parse case like ,s0 (knowing the comma must be there if required)
- if (SeenComma) {
+ if (parseOptionalToken(AsmToken::Comma)) {
if (getLexer().isNot(AsmToken::Identifier))
return Error(getLoc(), "invalid register");
StringRef RegName = getLexer().getTok().getIdentifier();
@@ -2668,8 +2656,10 @@ ParseStatus RISCVAsmParser::parseRegListCommon(OperandVector &Operands,
auto Encode = RISCVZC::encodeRlist(RegEnd, IsRVE);
assert(Encode != RISCVZC::INVALID_RLIST);
- if (MustIncludeS0)
- assert(Encode != RISCVZC::RA);
+
+ if (MustIncludeS0 && Encode == RISCVZC::RA)
+ return Error(S, "register list must include 's0' or 'x8'");
+
Operands.push_back(RISCVOperand::createRlist(Encode, S));
return ParseStatus::Success;
diff --git a/llvm/test/MC/RISCV/rv32xqccmp-invalid.s b/llvm/test/MC/RISCV/rv32xqccmp-invalid.s
index e43f86cbb84ee..5bfc2e3498bef 100644
--- a/llvm/test/MC/RISCV/rv32xqccmp-invalid.s
+++ b/llvm/test/MC/RISCV/rv32xqccmp-invalid.s
@@ -34,6 +34,6 @@ qc.cm.pushfp {ra, s0}, -12
# CHECK-ERROR: :[[@LINE+1]]:24: error: stack adjustment for register list must be a multiple of 16 bytes in the range [16, 64]
qc.cm.pop {ra, s0-s1}, -40
-# CHECK-ERROR: :[[@LINE+1]]:17: error: register list must include 's0' or 'x8'
+# CHECK-ERROR: :[[@LINE+1]]:14: error: register list must include 's0' or 'x8'
qc.cm.pushfp {ra}, -16
More information about the llvm-commits
mailing list