diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -1441,11 +1441,10 @@ // Attempts to match Name as a register (either using the default name or // alternative ABI names), setting RegNo to the matching register. Upon -// failure, returns true and sets RegNo to 0. If IsRVE then registers -// x16-x31 will be rejected. -static bool matchRegisterNameHelper(bool IsRVE, MCRegister &RegNo, - StringRef Name) { - RegNo = MatchRegisterName(Name); +// failure, returns a non-valid MCRegister. If IsRVE, then registers x16-x31 +// will be // rejected. +static MCRegister matchRegisterNameHelper(bool IsRVE, StringRef Name) { + MCRegister RegNo = MatchRegisterName(Name); // The 16-/32- and 64-bit FPRs have the same asm name. Check that the initial // match always matches the 64-bit variant, and not the 16/32-bit one. assert(!(RegNo >= RISCV::F0_H && RegNo <= RISCV::F31_H)); @@ -1453,11 +1452,11 @@ // The default FPR register class is based on the tablegen enum ordering. static_assert(RISCV::F0_D < RISCV::F0_H, "FPR matching must be updated"); static_assert(RISCV::F0_D < RISCV::F0_F, "FPR matching must be updated"); - if (RegNo == RISCV::NoRegister) + if (!RegNo.isValid()) RegNo = MatchRegisterAltName(Name); if (IsRVE && RegNo >= RISCV::X16 && RegNo <= RISCV::X31) - RegNo = RISCV::NoRegister; - return RegNo == RISCV::NoRegister; + RegNo = MCRegister(); + return RegNo; } bool RISCVAsmParser::parseRegister(MCRegister &RegNo, SMLoc &StartLoc, @@ -1473,10 +1472,10 @@ const AsmToken &Tok = getParser().getTok(); StartLoc = Tok.getLoc(); EndLoc = Tok.getEndLoc(); - RegNo = 0; StringRef Name = getLexer().getTok().getIdentifier(); - if (matchRegisterNameHelper(isRVE(), (MCRegister &)RegNo, Name)) + RegNo = matchRegisterNameHelper(isRVE(), Name); + if (!RegNo.isValid()) return MatchOperand_NoMatch; getParser().Lex(); // Eat identifier token. @@ -1508,10 +1507,9 @@ return MatchOperand_NoMatch; case AsmToken::Identifier: StringRef Name = getLexer().getTok().getIdentifier(); - MCRegister RegNo; - matchRegisterNameHelper(isRVE(), RegNo, Name); + MCRegister RegNo = matchRegisterNameHelper(isRVE(), Name); - if (RegNo == RISCV::NoRegister) { + if (!RegNo.isValid()) { if (HadParens) getLexer().UnLex(LParen); return MatchOperand_NoMatch; @@ -2050,10 +2048,9 @@ Error(getLoc(), "expected '.t' suffix"); return MatchOperand_ParseFail; } - MCRegister RegNo; - matchRegisterNameHelper(isRVE(), RegNo, Name); + MCRegister RegNo = matchRegisterNameHelper(isRVE(), Name); - if (RegNo == RISCV::NoRegister) + if (!RegNo.isValid()) return MatchOperand_NoMatch; if (RegNo != RISCV::V0) return MatchOperand_NoMatch; @@ -2069,10 +2066,9 @@ return MatchOperand_NoMatch; StringRef Name = getLexer().getTok().getIdentifier(); - MCRegister RegNo; - matchRegisterNameHelper(isRVE(), RegNo, Name); + MCRegister RegNo = matchRegisterNameHelper(isRVE(), Name); - if (RegNo == RISCV::NoRegister) + if (!RegNo.isValid()) return MatchOperand_NoMatch; SMLoc S = getLoc(); SMLoc E = SMLoc::getFromPointer(S.getPointer() + Name.size());