[llvm] [RISCV][MC] Reject invalid combined immediates for cv.insert in the disassembler (PR #225269)
Zeyi Xu via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 21 19:49:38 PDT 2026
https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/225269
None
>From d124a4fec64166c826b0bfb431d863d59e9dca24 Mon Sep 17 00:00:00 2001
From: Zeyi Xu <mitchell.xu2 at gmail.com>
Date: Tue, 22 Sep 2026 10:49:20 +0800
Subject: [PATCH] [RISCV][MC] Reject invalid combined immediates for cv.insert
in the disassembler
---
.../RISCV/Disassembler/RISCVDisassembler.cpp | 9 +++++++++
llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td | 6 +++++-
.../Disassembler/RISCV/xcvbitmanip-invalid.txt | 17 +++++++++++++++++
3 files changed, 31 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/MC/Disassembler/RISCV/xcvbitmanip-invalid.txt
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
index 99066346f0411..67e985352a614 100644
--- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -491,6 +491,15 @@ static DecodeStatus decodeFRMArg(MCInst &Inst, uint32_t Imm, int64_t Address,
return MCDisassembler::Success;
}
+static DecodeStatus decodeCVInsertIs2Operand(MCInst &Inst, uint32_t Imm,
+ int64_t Address,
+ const MCDisassembler *Decoder) {
+ const int64_t Is3 = Inst.getOperand(Inst.getNumOperands() - 1).getImm();
+ if (Is3 + Imm >= 32)
+ return MCDisassembler::Fail;
+ return decodeUImmOperand<5>(Inst, Imm, Address, Decoder);
+}
+
static DecodeStatus decodeZcmpRlist(MCInst &Inst, uint32_t Imm,
uint64_t Address,
const MCDisassembler *Decoder) {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td
index 15f0652c0301e..1730df6e431ed 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td
@@ -31,6 +31,10 @@ def cv_tuimm2 : TImmLeaf<XLenVT, [{return isUInt<2>(Imm);}]>;
def cv_tuimm5 : TImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]>;
def cv_uimm10 : ImmLeaf<XLenVT, [{return isUInt<10>(Imm);}]>;
+def cv_insert_is2 : RISCVUImmOp<5> {
+ let DecoderMethod = "decodeCVInsertIs2Operand";
+}
+
def CV_LO5: SDNodeXForm<imm, [{
return CurDAG->getTargetConstant(N->getZExtValue() & 0x1f, SDLoc(N),
N->getValueType(0));
@@ -354,7 +358,7 @@ let Predicates = [HasVendorXCVbitmanip, IsRV32] in {
let Constraints = "$rd = $rd_wb" in {
def CV_INSERT : CVInstBitManipRII<0b10, 0b000, (outs GPR:$rd_wb),
- (ins GPR:$rd, GPR:$rs1, uimm5:$is3, uimm5:$is2),
+ (ins GPR:$rd, GPR:$rs1, uimm5:$is3, cv_insert_is2:$is2),
"cv.insert", "$rd, $rs1, $is3, $is2">;
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
def CV_INSERTR : RVInstR<0b0011010, 0b011, OPC_CUSTOM_1, (outs GPR:$rd_wb),
diff --git a/llvm/test/MC/Disassembler/RISCV/xcvbitmanip-invalid.txt b/llvm/test/MC/Disassembler/RISCV/xcvbitmanip-invalid.txt
new file mode 100644
index 0000000000000..8b98dbf4201d9
--- /dev/null
+++ b/llvm/test/MC/Disassembler/RISCV/xcvbitmanip-invalid.txt
@@ -0,0 +1,17 @@
+# RUN: not llvm-mc -disassemble -triple=riscv32 -mattr=+xcvbitmanip < %s 2>&1 | FileCheck %s
+
+[0x5b,0x85,0x05,0xa1]
+# CHECK: warning: invalid instruction encoding
+# CHECK-NOT: cv.insert a0, a1, 16, 16
+
+[0x5b,0x85,0xf5,0x83]
+# CHECK: warning: invalid instruction encoding
+# CHECK-NOT: cv.insert a0, a1, 1, 31
+
+[0x5b,0x85,0x15,0xbe]
+# CHECK: warning: invalid instruction encoding
+# CHECK-NOT: cv.insert a0, a1, 31, 1
+
+[0x5b,0x85,0xf5,0xbf]
+# CHECK: warning: invalid instruction encoding
+# CHECK-NOT: cv.insert a0, a1, 31, 31
More information about the llvm-commits
mailing list