From 8cb8262de20b3199c8b037470294ca7909218924 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 11 May 2023 16:49:55 -0700 Subject: [PATCH] [RISCV] Fix crash if you use an immediate as part of a vtype operand list. --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 4 ++-- llvm/test/MC/RISCV/rvv/invalid.s | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 03e00cb..9d45b72 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -2034,12 +2034,12 @@ OperandMatchResultTy RISCVAsmParser::parseJALOffset(OperandVector &Operands) { OperandMatchResultTy RISCVAsmParser::parseVTypeI(OperandVector &Operands) { SMLoc S = getLoc(); - if (getLexer().isNot(AsmToken::Identifier)) - return MatchOperand_NoMatch; SmallVector VTypeIElements; // Put all the tokens for vtypei operand into VTypeIElements vector. while (getLexer().isNot(AsmToken::EndOfStatement)) { + if (getLexer().isNot(AsmToken::Identifier)) + goto MatchFail; VTypeIElements.push_back(getLexer().getTok()); getLexer().Lex(); if (getLexer().is(AsmToken::EndOfStatement)) diff --git a/llvm/test/MC/RISCV/rvv/invalid.s b/llvm/test/MC/RISCV/rvv/invalid.s index 41f8709..16f64cf 100644 --- a/llvm/test/MC/RISCV/rvv/invalid.s +++ b/llvm/test/MC/RISCV/rvv/invalid.s @@ -77,6 +77,9 @@ vsetvli a2, a0, e8,m1 vsetvli a2, a0, e8,m1,ta # CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] +vsetvli a2, a0, e8,1,ta,ma +# CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] + vadd.vv v1, v3, v2, v4.t # CHECK-ERROR: operand must be v0.t -- 2.7.4